将指针传递给C

时间:2016-05-18 19:22:29

标签: c arrays pointers malloc

问题:

我相当肯定我的问题是对指针发生的事情的典型误解。我将在下面发布内存中发生的事情,因为我的主要目标是学习如何正确调试,所以这可能是一篇关于其他问题的长篇文章。

这是代码,首先:

/*Generate array with 500 to 1000 elements*/
/*In the calling function, I create something like 'int* x;' and pass '&x'*/

void gen_array(int** arr){
    int size = rand() % (1001 - 500) + 500;
    int i;

    *arr = (int*) malloc(size*sizeof(int));

    if (*arr == NULL){
        printf("Allocation failed\n");
        exit(1); //I know this is probably bad form
    }

    //Fill with some random numbers from 1 to 1000
    for (i = 0; i < size; ++i)
        *arr[i] = rand() % 1001;
}

for循环中的第一次迭代后(即i==1时),它会中断。我不确定我是否在malloc中分配错误,或者在循环中分配错误。

这样打电话:

int* x = NULL; //Tried without '= NULL' as well
gen_array(&x);

具体错误:

Unhandled exception at 0x00265E55 in test.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC.

这是在<{em}之后的first-chance exception完全相同的位置,但是它们是在同一行代码中生成的(并且在执行期间在同一次迭代中生成)。

我尝试分析:

如果有帮助的话,这里是(相关的)逐步调试一次尝试(我在Visual Studio中进行编译)。我想知道如何使用这些信息来帮助我将来调试。

  • 在调用函数开始时,x = 0xcccccccc0xcccccccc=-842150451似乎是编译器用来填充未初始化值的内容)。设置为NULL后,它当然等于0x00000000
  • 调用gen_array(int** arr),因为我将指针传递给指针,本地的双指针&#39;是指向NULL指针的地址:arr=0x0018facc {0x00000000 {???}}。 (这显示了指向的内容的值,因为NULL指针指向什么,有???
  • 致电malloc:现在arr=0x0018facc {0x00e97048 {-842150451}},因此*arr指向未初始化的值
  • 首次迭代(i==0),生成的数字为588,现在为arr=0x0018facc {0x00e97048 {588}}(即*arr指向的值为{{1} })

588增加到i后,下一次迭代崩溃。由于它是一种访问冲突,我通常会猜测1并不期望被写入。但违规位置为arr+1,此编译器用于未初始化数据的值。这是因为0xCCCCCCCC在技术上是未初始化的吗?

编辑,因为@GrzegorzSzpetkowski建议,我尝试将arr+1更改为*arr[i]。它停止了破裂!但是,没有新的随机值被创建/放入阵列中(这就是为什么我担心阵列根本就没有被创建)。

编辑2 :对于@ EOF的建议,我更改了函数以返回大小,因此我可以调用类似(*arr)[i]

的内容

我知道我也可以尝试从函数中返回int length = gen_array(&x);,但是我想知道在将指针从调用函数传递到的情况下具体发生了什么。被初始化。

2 个答案:

答案 0 :(得分:2)

请检查*和[]的运算符优先级 http://en.cppreference.com/w/c/language/operator_precedence

*arr[i] = rand() % 1001;

装置

*(arr[i]) = rand() % 1001;

但你想要

(*arr)[i] = rand() % 1001;

答案 1 :(得分:0)

我只能看到一个错误:初始化数组时,您需要(*arr)[i] =,而不是*arr[i] =