如何使用指针访问使用malloc创建的2D数组的元素?

时间:2018-05-20 18:18:17

标签: c

我有这样的代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
int x=10;
int y=10;

int **data = (int**) malloc(x * sizeof(int));
if(!**data){
    printf("Error");
    return 1;
}
for(int i=0;i<x;i++){
    *(data+i) = (int*) malloc(y * sizeof(int));
    if(!*(data+i)){
        printf("Error");
        return 1;
    }
}

for(int i=0;i<x;i++){
    for(int j=0;j<y;j++){
        data[i][j]=(i+1)*(j+1);
    }
}

for(int i=0;i<x;i++){
    for(int j=0;j<y;j++){
        printf("%3i ",data[i][j]);
    }
    printf("\n");
}


return 0;
}

如何使用指针而不是data[i][j]来访问该数组的点?

我尝试搜索答案,但在每个例子中我都看到人们使用data[x][y]选项,我必须使用指针来访问每个元素。

该代码中的错误处理是否正确?

if(!**data){
    printf("Error");
    return 1;
}

1 个答案:

答案 0 :(得分:0)

这是一个主要问题,特别是在sizeof(int) != sizeof(int *)

的64位系统上
int **data = (int**) malloc(x * sizeof(int));

您分配的x大小是int的大小,而不是指向int的大小。

总是获得正确的大小有一个很好的“技巧”,使用sizeof *variable_youre_allocating_for。在你的情况下,它将是

int **data = malloc(x * sizeof *data);

这是有效的,因为sizeof *data是在编译时完成的,并且编译器知道*data的类型为int *,并且将使用正确的大小。

另请注意,我删除了演员it's not needed in C

除此之外,您对数据的使用是正确的。如果data[i][j]i是有效索引,并且jdata已正确初始化,则使用data[i]完全没问题。

重要的是要记住,对于任何指针或数组a和索引i,表达式a[i] 完全等于{{1} }。实际上,编译器会将*(a + i)翻译为a[i]。因此,对于指针*(a + i),表达式data完全等于*(data + i)。而后者通常更容易阅读和理解,也更少写。