使用 (int**) 指针分配 2D 数组元素的值会导致 EXC_BAD_ACCESS

问题描述 投票:0回答:2

我是 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;”并不能解决问题。

c pointers multidimensional-array exc-bad-access dynamic-arrays
2个回答
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);

0
投票

这行有错字

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 ) );
© www.soinside.com 2019 - 2024. All rights reserved.