[英]C Pointer Assignment: wrong address and segmentation fault
我這里有一個很奇怪的問題,希望有人可以幫助我。 那就是代碼。
Node *fct(Node *list)
{
Node *node;
node = list;
...
}
通常情況下,一切都運行順利,但是在某些隨機情況下,我會遇到細分錯誤。 我用GDB調試過。 通常,列表和節點的地址均為0x80d4000,但發生段故障時,節點的地址= 0x400。 (列表仍為0x80d4000)。
我真的不知道這可能會出錯,有什么想法嗎?
這還不足以確保代碼的正確性,但是我懷疑在某個地方,您傳遞了地址的副本(指針)並在COPY上進行了修改(如malloc); 而不是傳遞該地址的地址(指針上的指針),因此您實際上是在修改指針,而不是其副本之一。
一個例子來說明我在說什么:
int dostuff(char* str)
{
str = malloc(sizeof(char));
str[0] = 0x42;
return 1; // size of string.
}
int main(int argc, char** argv)
{
char* mystr = NULL;
unsigned int strlength = 0;
strlength = dostuff(mystr);
printf("%s\n", mystr); // Segfaults here: mystr == NULL.
free(mystr);
return 0;
}
所以這是正在發生的事情:
dostuff
。 該函數復制此值(具有char *類型),然后修改此副本。 當然,其余的main
不會執行。
這就是為什么有人會陷入困境的原因:通常,當您對某個函數使用指針並對其進行了一些修改時,您將修改其內容 ,而不是其地址。 修改其地址時,幾乎總是(在這種情況下除外)具有修改該地址以返回其新地址的功能。 就像在address = malloc(size)
。
另一方面,如果要設置一個POINTER(顯然不滿足),則需要將其地址的副本傳遞給函數。 這是上面代碼的工作版本:
int dostuff(char** str)
{
(*str) = malloc(sizeof(char));
(*str)[0] = 0x42;
return 1; // size of string.
}
int main(int argc, char** argv)
{
char* mystr = NULL;
unsigned int strlength = 0;
strlength = dostuff(&mystr);
printf("%s\n", mystr); // Now works: mystr is allocated.
free(mystr);
return 0;
}
因此請記住:如有疑問,請返回指針並獲取其他變量的地址(此處為strlength
)。 如果可能,請非常小心要處理的數據的實際類型,並在修改后仔細檢查您的地址。
希望對您有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.