簡體   English   中英

嘗試取消引用動態分配的指針時出現分段錯誤

[英]segmentation fault when trying to dereference a dynamically allocated pointer

我有一個動態分配的char數組,我想將兩個字符串組合到其中,因此我嘗試了以下操作:

char *strcpy2 (char *str1, char *str2)
{
    int total = strlen (str1) + strlen (str2) + 1;
    char *nstr = malloc (sizeof (char) * total);
    while (*str1 != '\0') *nstr++ = *str1++;
    while (*str2 != '\0') *nstr++ = *str2++;
    *nstr = '\0';
    printf ("size: %d\n", strlen (nstr));
    return &(nstr[0]);
}

int main (void)
{
    char *concat = strcpy2 ("Hello, ", "World.");
    puts (concat);
    free (concat);
    return 0;
}

當我運行它時,它打印的nstr大小為0,然后出現Segmentation fault (core dumped)

但是,當我這樣做時:

char *strcpy2 (char *str1, char *str2)
{
    int total = strlen (str1) + strlen (str2) + 1;
    char *nstr = malloc (sizeof (char) * total);
    char *p = nstr;
    while (*str1 != '\0') *p++ = *str1++;
    while (*str2 != '\0') *p++ = *str2++;
    *p = 0;
    printf ("size: %d\n", strlen (nstr));
    return nstr;
}

它工作正常,並打印了正確長度的nstr 我很困惑,是什么原因導致撞車?

您需要返回malloc()最初返回的nstr值。

您的第一個代碼塊遞增nstr直到它指向分配的內存的末尾。 然后,代碼嘗試使用並釋放該地址,該地址不屬於您的程序。

您需要保存字符串的起始地址,以便您可以返回它。

在第一種情況下,您不斷增加nstr ,最后使用

printf ("size: %d\n", strlen (nstr));

其中nstr指向所有增量之后的最終位置(包含null )。結果為0長度。 然后,將遞增的指針返回給調用者,並嘗試對其進行free() 導致未定義的行為

OTOH,在第二種情況下,您完整地指向了主要分配的內存的指針,通過該指針可以計算字符串長度,返回正確的值,然后free() ing也很合適,因此可以正常工作。

在第一個函數中,您將返回錯誤的指針。 它指向字符串的空終止符,因此長度為零。 當您嘗試free()它時,它不是從malloc()獲得的指針。 未定義的行為結果。

復制兩個字符串時,您將增加nstr指針,這就是您用來表示字符串本身的指針。 只需將其復制到另一個變量中,並在引用字符串時使用它:

char *strcpy2 (char *str1, char *str2)
{
    int total = strlen (str1) + strlen (str2) + 1;
    char *nstr = malloc (sizeof (char) * total);
    char *str = nstr;                                // the string
    while (*str1 != '\0') *nstr++ = *str1++;
    while (*str2 != '\0') *nstr++ = *str2++;
    *nstr = '\0';
    printf ("size: %d\n", strlen (str));             // used here
    return str;                                      // and here
}

您可以在這里查看它的運行情況: https : //ideone.com/ncpVMU

我還隨意修改了您的愚蠢的return語句:

return &(nstr[0]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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