簡體   English   中英

C指針分配:錯誤的地址和分段錯誤

[英]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;
}

所以這是正在發生的事情:

  1. 創建一個新的char指針,將其設置為NULL(例如,如果要重新分配,則更好)。
  2. 您將其值(NULL)傳遞給dostuff 該函數復制此值(具有char *類型),然后修改此副本。
  3. printf訪問mystr進行打印,並嘗試從NULL [0](0)讀取時,將出現段錯誤。

當然,其余的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.

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