创建数组并使用指针访问它们

时间:2015-08-13 13:39:05

标签: c arrays pointers

在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 

????????

1 个答案:

答案 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 *的值可以在没有显式强制转换的情况下分配给其他指针类型(反之亦然)。

无论如何,在C中; C ++需要强制转换,但你不应该在C ++代码中使用void *