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