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

标签 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 

但是当我将显示 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开始,不需要转换 malloc2 的返回值,并且在 C89/90 编译器下它可能会掩盖错误。 C 中推荐的做法是转换malloc的结果。

我们不是将类型传递给 sizeof,而是传递表达式 *D,该表达式的类型为 int [cols] 。所以sizeof *Dsizeof (int [cols])相同;将结果乘以 lig 即可得出数组的总大小(以字节为单位)。

<小时/> 1.在 1989 年标准之前,malloc 返回一个 char * 类型的值,因此如果您想将其分配给不同的指针类型,则需要进行强制转换。 void * 类型的值可以分配给其他指针类型(反之亦然),无需显式强制转换。

2.无论如何,在C语言中; C++ 需要强制转换,但不应在 C++ 代码中使用 malloc

关于创建数组并使用指针访问它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31989899/

相关文章:

c++ - 指向数组语法的指针

c++ - 使用序列优雅地初始化静态(成员)数组

javascript - 具有匹配值的 jQuery 动态数组

c++ - 删除间接指针是否正确

Cholesky 分解的 C 语法

与 C 中的 bool 变量比较

c - 在 C 中使用 pow() 处理大量计算

c - ftruncate() 对大页面失败

java - java中如何指向对象?

c - 在 C 中使用 va_list 作为数组