【发布时间】:2016-02-13 02:24:20
【问题描述】:
我目前正在搞乱 c 我在指针使用和语法方面遇到了一些问题。
下面,我正在(尝试)创建一个指向整数数组的指针数组,然后将每个指针指向通过 malloc() 创建的数组。
数组创建完成后,for 循环遍历每个单元格,分配一个值。
现在,所有这些似乎都在工作,但是当涉及到使用 free() 收回内存时,程序崩溃了。
我注意到,如果我 malloc() 数组内存,然后立即在它们上调用 free(),程序执行没有问题。但是,当我 malloc()、分配值然后调用 free() 时,就会发生崩溃。 (分段错误)。
下面是有效的代码,malloc() 然后立即 free()ing
int (*ptrArr[5])[5];
for(int i=0; i<5; i++)
ptrArr[i] = malloc(sizeof(int) * 5);
for(int i=0; i<5; i++)
printf("ptrArr[%d][%x]->[%x]\n", i, &ptrArr[i], &*ptrArr[i]);
printf("\n");
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
printf("[%x](%2d) | ", &*ptrArr[i][j], *ptrArr[i][j]);
}
printf("\n");
}
for(int i=4; i>=0; i--)
free(ptrArr[i]);
上面的代码按我的预期执行,但是当我给单元格赋值,然后尝试调用 free 时,会产生分段错误:
int (*ptrArr[5])[5];
for(int i=0; i<5; i++)
ptrArr[i] = malloc(sizeof(int) * 5);
for(int i=0; i<5; i++)
printf("ptrArr[%d][%x]->[%x]\n", i, &ptrArr[i], &*ptrArr[i]);
printf("\n");
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
printf("[%x](%2d) | ", &*ptrArr[i][j], *ptrArr[i][j]);
}
printf("\n");
}
int loop = 5;
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
*ptrArr[i][j] = (loop + (i*j));
++loop;
}
}
printf("\n");
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
printf("[%x](%2d) | ", &*ptrArr[i][j], *ptrArr[i][j]);
}
printf("\n");
}
for(int i=4; i>=0; i--)
{
printf("Freeing ptrArr[%x]\n", i);
free(ptrArr[i]);
}
我想我要么误解了
int (*ptrArr[5])[5];
声明,我的意图是一个包含 5 个指针的数组,每个指针指向一个整数数组,或者我没有正确地为单元分配值,而是破坏了内存,导致 free() 失败。
任何帮助将不胜感激,我希望问题清晰简洁。
谢谢。
【问题讨论】:
-
int *ptrArr[5]正在声明由 5 个指针组成的数组。 -
我认为第一个代码不起作用。试试大于 5 的尺寸,也许是 10000
标签: c pointers memory-management segmentation-fault malloc