我有这样的代码:
#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;
}
答案 0 :(得分:0)
这是一个主要问题,特别是在sizeof(int) != sizeof(int *)
:
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
是有效索引,并且j
和data
已正确初始化,则使用data[i]
完全没问题。
重要的是要记住,对于任何指针或数组a
和索引i
,表达式a[i]
完全等于{{1} }。实际上,编译器会将*(a + i)
翻译为a[i]
。因此,对于指针*(a + i)
,表达式data
完全等于*(data + i)
。而后者通常更容易阅读和理解,也更少写。