1

我正在尝试运行这个程序,其中创建一个字符数组并动态分配内存。稍后,数组元素将填充 10 个连续位置的字符串“hello”。使用 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++);
}
4

3 回答 3

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 );
于 2014-10-07T06:46:37.910 回答
1

您应该迭代十个元素,直到不存在的标记值( NULL):

for (i = 0; i < 10; i++) {
    free(p[i]);
}

您当前的代码取消引用p[10],它在数组边界之外,因此会触发未定义的行为

于 2014-10-07T06:32:11.367 回答
1

访问数组边界之外的值意味着未经授权的内存访问。因此,您最终会因为p++. 所以试试这样。

  i=0;
  while(i<10)
  {
   free(p[i]);
   i++;
  }
于 2014-10-07T06:36:53.433 回答