这是我的代码。如果我对这段代码有误,请告诉我。 代码:
char **arrofstr(void)
{
char **ret = malloc(sizeof(*ret)*3);
ret[0] = strdup("idx0");
ret[1] = strdup("idx1");
ret[2] = '\0';
return ret;
}
void freearr(char ***ptr)
{
int i=0;
while(*ptr[i] != '\0')
{
free(*ptr[i]);
printf("free(ptr[%d])\n", i);
i++;
}
free(*ptr);
}
int main(void)
{
char **arr = arrofstr();
int i=0;
while(arr[i] != '\0')
{
printf("%s\n");
i++;
{
freearr(&arr);
return 0;
}
这是我编译后终端的输出 输出:
$ ./arrofstr
idx0
idx1
free(ptr[0])
segmentation fault
我不知道这段代码有什么问题,我使用的是gcc 3.1.0。
最佳答案
free(*ptr[i]);
*
运算符 get 在 [i]
运算符之后执行,参见 operator precedence .所以代码首先跳转 i * sizeof(*ptr)
字节,然后取消引用。你想要:
free((*ptr)[i]);
同时打开编译警告 -Wall
并且不要将整数值 '\0'
(等于 0x00)分配给指针。为此使用 NULL
。
@编辑 所以,试试这个:
#include <stdio.h>
char **arrofstr(void)
{
char **ret = malloc(sizeof(*ret)*3);
ret[0] = strdup("idx0");
ret[1] = strdup("idx1");
ret[2] = NULL;
return ret;
}
void freearr(char ***ptr)
{
int i=0;
while((*ptr)[i] != NULL)
{
free((*ptr)[i]);
printf("free(ptr[%d])\n", i);
i++;
}
free(*ptr);
}
int main(void)
{
char **arr = arrofstr();
int i=0;
while(arr[i] != NULL)
{
printf("%s\n", arr[i]);
i++;
}
freearr(&arr);
return 0;
}
关于c - 为什么在从其他函数释放字符串数组时出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52677882/