我正在尝试运行这个程序,其中动态创建字符数组并分配内存。稍后,数组元素将连续 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]
,这超出了数组边界,因此会触发未定义的行为。