我遇到了免费的麻烦。我想分配一个*字符的二维数组并释放它们,但它在运行时失败了。我正在学习指针,可能会使这个问题复杂化。
//NUMBEROFLINES, NUMBEROFDIE, and WIDTHOFDIE are some ints (3, 2, 3),
int iLineSize, iLine, iDie;
char **piDieString;
piDieString = (char**)malloc(NUMBEROFLINES * sizeof(*piDieString)); //Allocate number of lines
iLineSize = NUMBEROFDIE * WIDTHOFDIE * sizeof(char); //Size of line
for(iLine = 0; iLine < NUMBEROFLINES; iLine++)
{
piDieString[iLine] = (char*)malloc(iLineSize); //Allocate size of lines
}
//Stuff happens
/*Freeing*/
for(iLine = 0; iLine < NUMBEROFLINES; iLine++)
{
free(piDieString[iLine]);
}
free(piDieString);
答案 0 :(得分:1)
我认为//Stuff happens
中出现了问题。
添加了打印件以验证是否正在按如下方式正确分配和释放内存:
#include <stdio.h>
#define NUMBEROFLINES 3
#define NUMBEROFDIE 2
#define WIDTHOFDIE 3
int main(void) {
int iLineSize, iLine, iDie;
char **piDieString;
piDieString = (char**)malloc(NUMBEROFLINES * sizeof(*piDieString)); //Allocate number of lines
printf("Allocated piDieString: 0x%x\n",piDieString );
iLineSize = NUMBEROFDIE * WIDTHOFDIE * sizeof(char); //Size of line
for(iLine = 0; iLine < NUMBEROFLINES; iLine++)
{
piDieString[iLine] = (char*)malloc(iLineSize); //Allocate size of lines
printf("Allocating piDieString[%d]: 0x%x\n",iLine,piDieString[iLine] );
}
//Stuff happens
/*Freeing*/
for(iLine = 0; iLine < NUMBEROFLINES; iLine++)
{
printf("Freeing piDieString[%d]: 0x%x\n",iLine,piDieString[iLine] );
free(piDieString[iLine]);
}
printf("\nFreeing piDieString: 0x%x\n",piDieString );
free(piDieString);
return 0;
}
输出就是这样看起来很好。
Allocated piDieString: 0x966e008
Allocating piDieString[0]: 0x966e018
Allocating piDieString[1]: 0x966e028
Allocating piDieString[2]: 0x966e038
Freeing piDieString[0]: 0x966e018
Freeing piDieString[1]: 0x966e028
Freeing piDieString[2]: 0x966e038
Freeing piDieString: 0x966e008
详细说明"but it fails at runtime"
......就像你看到崩溃一样?如果是,请检查//Stuff happens
是否有内存访问...
答案 1 :(得分:0)
如果没有打印你的2d指针的地址然后尝试你会看到令人惊讶的东西,因为在redhat我在这里看到2d数组动态地址不连续其他这个地方我没有看到任何地方那个数组有非连续的记忆。可能这不连续会产生一些问题。我不是确切的原因。