我在理解指针和动态内存分配方面遇到了一些麻烦。我写了这两个代码:
int **array;
array = malloc(nrows * sizeof(int *));
if(array == NULL)
{
fprintf(stderr, "out of memory\n");
return -1;
}
for(i = 0; i < nrows; i++)
{
*(array+i) = malloc(ncolumns * sizeof(int));
if(array[i] == NULL)
{
fprintf(stderr, "out of memory\n");
return -1;
}
}
和
int **array;
array = malloc(nrows * sizeof(int *));
if(array == NULL)
{
fprintf(stderr, "out of memory\n");
return -1;
}
for(i = 0; i < nrows; i++)
{
array[i] = malloc(ncolumns * sizeof(int));
if(array[i] == NULL)
{
fprintf(stderr, "out of memory\n");
return -1;
}
}
他们应该为二维数组分配空间。虽然我不确定它们是否正确,但我的意思是:这一行:
array[i] = malloc(ncolumns * sizeof(int));
完成同样的事情:
*(array+i) = malloc(ncolumns * sizeof(int));
答案 0 :(得分:3)
是
array[i]
,*(array+i)
和i[array]
被编译器视为相同的东西。
答案 1 :(得分:2)
是的,在编译代码时,它们都应该被视为相同。
答案 2 :(得分:2)
*(array + i)
和array[i]
都评估相同的事情(假设一个是指针而另一个是整数)。为了您的理智和其他人的使用,请使用第二种形式;它会更容易阅读和维护。
如果您在编译时知道数组维度的大小,或者如果您正在使用支持可变长度数组的编译器,则可以稍微简化一下:
int (*array)[ncols] = malloc( sizeof *array * nrows );
这将为nrows
x ncols
int
数组分配足够的内存。如果您正在使用不支持可变长度数组的编译器,则必须在编译时知道ncols
(即,它必须是宏或其他编译时常量)。您可以像访问任何常规2D数组一样访问数组元素:
array[i][j] = x;
这种方法相对于两步法的一个优点是所有内存都是连续分配的;也就是说,所有行都将在内存中相邻。如果您希望将数组视为单个连续的数据blob(例如,如果您通过write
系统调用通过套接字发送它),则这很重要。使用两步法,不能保证所有行都是相邻的。
另一个好处是,释放只需要一次调用free
:
free( array );
答案 3 :(得分:1)
int **array;
array = malloc(nrows * sizeof(int *));
变量数组是指针或双指针变量的数组。这些指针的值在下一个数组分配中完成:
array[i] = malloc(ncolumns * sizeof(int)); or
*(array+i) = malloc(ncolumns * sizeof(int));
array [i]
==&GT;我是数组的索引,包含由malloc(ncolumns * sizeof(int));
*(array + i)
==&gt;是用于解析数组的偏移量,* array + i)是由malloc(ncolumns * sizeof(int));
分配的指针的值
所以
array[i] = malloc(ncolumns * sizeof(int));
and
*(array+i) = malloc(ncolumns * sizeof(int));
完全相同