[英]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.