C指针挫败EXC_BAD_ACCESS

时间:2013-05-08 13:39:42

标签: c pointers

有人可以告诉我以下代码有什么问题吗?我得到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 个答案:

答案 0 :(得分: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.

答案 1 :(得分:2)

的定义
int **pt_all_arrays[7];

应该是

int *pt_all_arrays[7];

答案 2 :(得分:0)

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

答案 3 :(得分:0)

int **pt_all_arrays[7];

这个actaully声明了一个指向int的7个指针数组。 (指向int数组的指针)。所以如果你想存储你需要的数组:

int *pt_all_arrays[7];

访问阵列时:

pt_all_arrays[i]

这实际上是这样说的:

*(pt_all_arrays + i)

因此,您不想将其他*添加到其中,只需:

pt_all_arrays[i] = myarray;

会这样做。