繁体   English   中英

在while循环中的Free()

[英]Free() inside a while loop

我正在尝试运行该程序,其中创建了字符数组并动态分配了内存。 之后,在数组元素中使用字符串“ 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++);
}

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

您应该遍历十个元素,直到没有不存在的哨兵值NULL ):

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

您当前的代码取消引用p[10] ,它在数组范围之外,因此触发了undefined behavior

访问数组界限之外的值,表示未经授权的内存访问。 因此,只有p++导致崩溃。 所以尝试这样。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM