C语言 在 while 循环中 free()



我正在尝试运行这个程序,其中动态创建字符数组并分配内存。稍后,数组元素将连续 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++);
}

如果你非常想使用你的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 );

访问数组绑定之外的值意味着未授权的内存访问。所以只有,你最后因为p++而崩溃。所以试试这样。

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

你应该迭代十个元素,直到不存在的哨兵值(NULL(:

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

您当前的代码取消引用 p[10] ,这超出了数组边界,因此会触发未定义的行为。

相关内容

  • 没有找到相关文章

最新更新