2011-10-13 52 views
0

我目前有以下代碼。一個結構內的C字符串的malloc內存

struct qnode 
    { 
     char *path; 
     struct qnode *next; 
    } 

    typedef struct qnode Node; 

我的代碼在這一點失敗,但是當我嘗試在struct qnode中使用malloc空間時。

void add(Node *front, Node *back,char **path) 
{ 
    /* Create the new node */ 
    Node *cur = (Node *)malloc(sizeof(Node)); 

    /* Verify node successfully created */ 
    if(cur) 
    { 
      /* Populate Members of Node */ 
      cur->path = malloc(strlen(*path)); /* fails here */ 
      printf("Malloc path success"); 
      cur->path = *path; 

我已經驗證了strlen確實在正確的指針上運行,它確實返回了長度的大小。出於某種原因,雖然我在這一點上遇到了分段錯誤,但我不明白爲什麼。

F.y.i這是一個任務的一部分但是,這個簡單的malloc行不是明確分配的東西,也不是使用C語言。我被允許在作業上做C++,但是我選擇了C來獲得更多關於該語言的知識。

感謝您的幫助!

+1

什麼是'path'類型的一部分嗎?爲什麼要丟棄第二個'malloc'返回的指針? – Mat

回答

3

您沒有分配足夠的內存。你需要爲零終結者留下空間。您還必須複製字符串的內容,而不是將指針分配給字符串。這兩個錯誤都會導致堆損壞並解釋你的錯誤。該代碼應該是這樣的:

cur->path = malloc(strlen(*path)+1); 
printf("Malloc path success"); 
strcpy(cur->path, *path); 

你當然可以使用strdup,如果你的系統有它可用,但要注意,它也不是標準C.

+0

感謝您的幫助。我意識到我錯過了strcpy部分,但忘了進去改變它。我的錯誤實際上是一個簡單的小錯誤,但如果您注意到我的「臨時」調試語句並不完全有用,因爲我忘記包含\ n來刷新輸出緩衝區,以便在正確的時間打印輸出緩衝區。感謝您的幫助!而且我並沒有意識到strdup,我只是在我的系統上認識到它使事情變得容易一些。同樣,由strlen(* path)返回的值確實是包含'\ 0'的實際大小,因爲我剛剛也調查過這一點。 – Ben

+2

本,你需要調查你的調查。 strlen絕對不應該計算終止'\ 0'。 –

+0

@本奈傑爾是正確的。 'strlen'不計算任何'\ 0'字符。你一定弄錯了。 –