我试图运行这个程序,在这个程序中创建一个字符数组并动态分配内存。之后,数组元素将填充字符串" hello"连续10个地点。使用strdup()函数调用将值赋给字符串元素。
一旦分配了所有元素,就会在while循环中释放元素。当我在Visual Studio中运行程序时,程序在释放最后一个指向char数组的指针后崩溃。我相信while循环的终止条件是正确的。但我无法确定究竟是什么导致了这个问题。
代码:
char **p;
int i;
p = malloc(10 * sizeof(char *));
for (i = 0; i < 10; i++) {
p[i] = strdup(“hello”);
}
while (*p) {
free(*p++);
}
答案 0 :(得分:4)
如果您非常想要使用while循环,那么您应该按照以下方式编写代码
char **p;
int i;
p = malloc(11 * sizeof(char *));
for (i = 0; i < 10; i++) {
p[i] = strdup(“hello”);
}
p[i] = NULL;
while (*p) {
free(*p++);
}
考虑到您还需要释放p本身的初始值。所以带有while循环的正确代码可能看起来像
char **p;
int i;
p = malloc(11 * sizeof(char *));
for (i = 0; i < 10; i++) {
p[i] = strdup(“hello”);
}
p[i] = NULL;
char **q = p;
while (*q) {
free(*q++);
}
free( p );
答案 1 :(得分:1)
你应该迭代十个元素,而不是直到不存在的sentinel value(NULL
):
for (i = 0; i < 10; i++) {
free(p[i]);
}
您当前的代码解除引用p[10]
,它位于数组范围之外,因此会触发undefined behaviour。
答案 2 :(得分:1)
访问数组绑定之外的值意味着未经授权的内存访问。所以,由于p++
,你最终崩溃了。所以试试这样。
i=0;
while(i<10)
{
free(p[i]);
i++;
}