1

有人可以告诉我以下代码有什么问题吗?我得到了EXC_BAD_ACCESS,无法访问内存。原因:KERN_INVALID_ADDRESS

我声明了一个由 7 个指针组成的全局数组,每个指针指向一个不同大小的 int 数组。

int **pt_all_arrays[7];

在我的功能中A()

    for (int i = 0; i < 7; ++i) {
        int array_size = function_that_returns_array_size();
        int *myarray = (int *)malloc(array_size * sizeof (int));

        // DO WORK...    

        // Store the array in the big array
        *(pt_all_arrays[i]) = myarray;  <-----EXCEPTION
    }

在最后一行抛出异常。我在 Mac 上运行,gcc -std=gnu99

4

4 回答 4

4

你想声明为

int *pt_all_arrays[7];

然后分配为

pt_all_arrays[i] = myarray;

随着int **pt_all_arrays[7];您创建指向 int 指针的指针数组,这不是您想要的。

并且*(pt_all_arrays[i]) = myarray;您正在尝试更改为无效的数组地址。

例子

int array[7];
int *pi;
array = pi; //this is not valid.
于 2013-05-08T13:42:21.837 回答
2

的定义

int **pt_all_arrays[7];

应该

int *pt_all_arrays[7];
于 2013-05-08T13:42:36.777 回答
0

在最后一行中,您尝试写入 . 指向的内存位置pt_all_arrays[i]。由于pt_all_arrays[i]尚未初始化,这可能指向任何地方。在您的情况下,它指向无效的内存地址。

于 2013-05-08T13:44:24.737 回答
0
int **pt_all_arrays[7];

这实际上声明了一个由 7 个指针组成的数组,这些指针指向 int 的指针。(指向 int 数组的指针)。因此,如果您想存储数组,您只需要:

int *pt_all_arrays[7];

当您访问数组时:

pt_all_arrays[i]

这实际上与以下内容相同:

*(pt_all_arrays + i)

因此,您不想在其中添加其他*内容,只需:

pt_all_arrays[i] = myarray;

会做。

于 2013-05-08T13:47:24.160 回答