我是 MacOS 用户,我想用 C 编写一个函数,为二维(动态分配)数组的每个元素分配值 0。但是当我编译并运行程序时,出现错误消息“发生异常。EXC_BAD_ACCESS” (代码=1,地址=0x0)”指向该短语 “arr[i][j] = 0;”出现。
#include <stdlib.h>
#include <stdio.h>
#define SIZE 8
/* assigns 0 to all elements of 2d array */
void clearArr(int **arr, int rows, int collumns)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < collumns; j++)
{
arr[i][j] = 0;
}
}
}
int main(void)
{
int **arr = (int**)malloc(sizeof(int) * (size_t)SIZE);
for (int i = 0; i < SIZE; i++)
{
arr[i] = (int*)malloc(sizeof(int) * (size_t)SIZE);
}
clearArr(arr, SIZE, SIZE);
for (int i = 0; i < SIZE; i++)
{
free(arr[i]);
}
free(arr);
return 0;
}
将其替换为“((arr + i) + j) = 0;”并不能解决问题。
您没有二维数组,只有指针数组。我建议改用数组指针。
void clearArr(size_t rows, size_t collumns, int (*arr)[collumns] )
{
for (size_t i = 0; i < rows; i++)
{
for (size_t j = 0; j < collumns; j++)
{
arr[i][j] = 0;
}
}
}
int main(void)
{
size_t rows = 10;
size_t cols = 20;
int (*arr)[cols] = rows * sizeof(*arr);
clearArr(rows, cols, arr);
free(arr);
return 0;
}
您的代码无效,因为您没有分配正确的内存量。你应该:
int **arr = malloc(sizeof(*arr) * SIZE);
这行有错字
int **arr = (int**)malloc(sizeof(int) * (size_t)SIZE);
^^^^^^^^^^^
您正在分配一个指针数组。所以你需要写
int **arr = (int**)malloc(sizeof(int *) * (size_t)SIZE);
^^^^^^^^^^^^
将整型常量
size_t
转换为类型 SIZE
也是多余的。你可以直接写
int **arr = malloc( SIZE * sizeof( *arr ) );
请注意,您可以使用另一种方法来分配内存,该方法可以简单地将分配的数组的元素设置为零。
你在这里
#include <stdlib.h>
#include <stdio.h>
#define SIZE 8
int main(void)
{
int **arr = malloc( SIZE * sizeof( *arr ) );
arr[0] = calloc( SIZE * SIZE, sizeof( *arr[0] ) );
for (int i = 1; i < SIZE; i++)
{
arr[i] = arr[i-1] + SIZE;
}
free( arr[0] );
free(arr);
return 0;
}
或者如果使用 malloc 代替 calloc
arr[0] = malloc( SIZE * SIZE * sizeof( *arr[0] ) );
然后将数组的元素设置为零,你可以这样写
memset( arr[0], 0, size * size * sizeof( int ) );