[英]Why I got segmentation fault while free array of string from other function?
這是我的代碼。 如果這個代碼有誤,請告訴我。 碼:
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]);
*
運算符在[i]
運算符之后執行,請參閱運算符優先級 。 因此,代碼首先跳轉i * sizeof(*ptr)
個字節,然后取消引用。 你要:
free((*ptr)[i]);
還要打開編譯警告-Wall
並且不要為指針分配整數值'\\0'
(等於0x00)。 為此使用NULL
。
@edit因此,請嘗試以下操作:
#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;
}
我調試了您的版本,正如@Kamil指出的
free((*ptr)[i])
由於printf("%s\\n")
,他的版本可能無法正常工作,所以我測試了一下:
#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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.