我目前在研究C语言,对指针使用和语法方面遇到了一些问题。
下面,我试图创建一个整数数组的指针数组,然后将每个指针指向通过malloc()创建的数组。
在创建完数组后,我使用for循环遍历每个元素并赋值。
现在,所有这些似乎都在工作,但是当我使用free()来释放内存时,程序会崩溃。
我发现如果我先用malloc()分配数组内存,然后立即调用free(),程序就能顺利执行。然而,如果我先malloc(),再赋值,然后再调用free(),程序就会崩溃(Segmentation fault)。
以下是可以运行的代码,其中使用了malloc()并立即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");
}
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 个指针的数组。 - Eugene Sh.