【问题标题】:Creating arrays and accessing them with pointers创建数组并使用指针访问它们
【发布时间】:2015-08-13 13:39:05
【问题描述】:

在 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 

??????????

【问题讨论】:

  • 标准警告:不要像 malloc 和朋友返回的那样投射 void *。 C 不是 C++!
  • 二维数组不同于“指针数组(指向数组)”。
  • "malloc" 也以字节为单位分配内存 - 因此您需要调整内存量以适应 'int' 的大小
  • 我强烈推荐读一本 C 书。你所有的问题都应该在那里处理。

标签: c arrays pointers


【解决方案1】:

这令人困惑:

D=(int*)malloc(sizeof(int*)*col); 
D=(int*)CopieD;

您调用malloc 分配一些内存并将指针分配给D。然后,您立即用 CopieD 的地址覆盖该指针,从而失去对动态分配内存的引用。

您希望D 简单地指向 CopieD,还是希望D 成为CopieD副本

如果您只是想让D 指向CopieD,请执行以下操作:

int (*D)[col] = CopieD; // assumes int CopieD[lig][col]

int (*D)[col]D 声明为指向col 元素数组int指针;尽管声明中存在[col],但它不是一个数组。表达式CopieD“衰减”从类型“lig-元素数组col-元素数组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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-12
    • 2021-08-27
    • 2013-12-22
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多