在C语言中,在我的文件Lire.h中,我有:
int* D;
在文件 Lire.c 中,我有:
D=(int*)malloc(sizeof(int*)*col);
D=(int*)CopieD;
for(i=0; i<lig;i++){
for(j=0; j<col;j++){
printf("%d ",*(D+i*col+j));
}
printf("\n");
}
这告诉我:
1 1 1 3 4 1
1 2 3 8 2 1
1 3 3 5 4 7
2 1 4 1 1 4
2 2 2 3 9 3
2 3 9 1 2 2
3 1 8 6 3 5
3 2 4 5 8 1
但是当我将显示 block 放入文件 main.c 中时,它不能正常工作
int main(){
for(i=0; i<lig;i++){
for(j=0; j<col;j++){
printf("%d ",*(D+i*col+j));
}
printf("\n");
}
}
它给出:
1 1 1 3 855638020 1
1 2 4206857 1 1 0
2345187 0 1 0 4 7
2 1 4 1 1 4
2 2 2 3 9 3
2 3 9 1 -2146121937 1
3 1 -2146122209 1 1 5
3 0 0 0 0 0
??????
最佳答案
这很令人困惑:
D=(int*)malloc(sizeof(int*)*col);
D=(int*)CopieD;
您调用malloc
来分配一些内存并将指针分配给D
。然后,您立即用 CopieD 的地址覆盖该指针,从而丢失对动态分配的内存的引用。
您希望 D
简单地指向到 CopieD
,还是希望 D
成为 <CopieD
的 em> 副本 ?
如果您只是想让 D
指向到 CopieD
,请执行以下操作:
int (*D)[col] = CopieD; // assumes int CopieD[lig][col]
int (*D)[col]
将 D
声明为指向 col
元素数组的指针 int
;尽管声明中存在 [col]
,但它不是数组。表达式 CopieD
从类型“lig
-col
-element array of int
”类型“衰减”为输入“指向 col
元素数组 int
的指针”。
如果您希望 D
成为 CopieD
的副本,那么您可以这样做:
int (*D)[col] = malloc( sizeof *D * lig ); // notice no cast, sizeof operand
memcpy( CopieD, D, sizeof *D * lig );
无论哪种情况,您的显示代码都将编写为
for(i=0; i<lig;i++)
{
for(j=0; j<col;j++){
printf("%d ", D[i][j] );
}
printf("\n");
下标运算符[]
在指针上的作用与在数组对象上的作用相同。
关于 malloc
调用的注释:
从 1989 年标准1开始,不需要转换 malloc
2 的返回值,并且在 C89/90 编译器下它可能会掩盖错误。 C 中推荐的做法是不转换malloc
的结果。
我们不是将类型传递给 sizeof
,而是传递表达式 *D
,该表达式的类型为 int [cols]
。所以sizeof *D
与sizeof (int [cols])
相同;将结果乘以 lig 即可得出数组的总大小(以字节为单位)。
malloc
返回一个 char *
类型的值,因此如果您想将其分配给不同的指针类型,则需要进行强制转换。 void *
类型的值可以分配给其他指针类型(反之亦然),无需显式强制转换。 2.无论如何,在C语言中; C++ 需要强制转换,但不应在 C++ 代码中使用
malloc
。
关于创建数组并使用指针访问它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31989899/