簡體   English   中英

為什么從其他函數釋放字符串數組時出現分段錯誤?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM