在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
但是当我将显示块放在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
????????
答案 0 :(得分:0)
这令人困惑:
D=(int*)malloc(sizeof(int*)*col);
D=(int*)CopieD;
您调用malloc
分配一些内存并将指针指定给D
。然后,您立即使用CopieD的地址覆盖该指针,从而失去对该动态分配的内存的引用。
您希望D
只是指向到CopieD
,还是希望D
成为{em>副本 { {1}}?
如果您只是希望CopieD
指向到D
,请执行以下操作:
CopieD
int (*D)[col] = CopieD; // assumes int CopieD[lig][col]
将int (*D)[col]
声明为指针到D
- col
的元素数组;尽管声明中存在int
,但它不是数组。表达式[col]
&#34;衰变&#34;来自类型&#34; CopieD
- lig
的元素数组 - col
&#34的元素数组;输入&#34;指向int
的指针 - col
&#34;的元素数组。
如果您希望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");
在指针上的工作方式与在数组对象上的工作方式相同。
关于[]
电话的说明:
从1989年标准 1 开始,您不需要转换malloc
2 的返回值,而在C89 / 90编译器下它可能掩盖一个bug。 C中的推荐做法是不转换malloc
的结果。
我们不会将类型传递给malloc
,而是传递表达式 sizeof
,其类型为*D
。因此int [cols]
与sizeof *D
相同;乘以sizeof (int [cols])
得到的结果给出了数组的总大小(以字节为单位)。
<小时/> 1。在1989标准之前,
lig
返回了malloc
类型的值,因此如果要将其指定给不同的指针类型,则需要强制转换。类型char *
的值可以在没有显式强制转换的情况下分配给其他指针类型(反之亦然)。 void *
。