我相当肯定我的问题是对指针发生的事情的典型误解。我将在下面发布内存中发生的事情,因为我的主要目标是学习如何正确调试,所以这可能是一篇关于其他问题的长篇文章。
这是代码,首先:
/*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 = 0xcccccccc
(0xcccccccc=-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);
,但是我想知道在将指针从调用函数传递到的情况下具体发生了什么。被初始化。
答案 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] =
。