繁体   English   中英

C指针挫折EXC_BAD_ACCESS

[英]C pointer frustration EXC_BAD_ACCESS

有人可以告诉我以下代码有什么问题吗? 我正在获取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

您可能想声明为

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.

的定义

int **pt_all_arrays[7];

应该

int *pt_all_arrays[7];

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

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;

会做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM