在while循环中的Free()

时间:2014-10-07 06:29:35

标签: c arrays malloc free strdup

我试图运行这个程序,在这个程序中创建一个字符数组并动态分配内存。之后,数组元素将填充字符串" 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++);
}

3 个答案:

答案 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 valueNULL):

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++;
  }