2014-02-13 32 views
2

我是一個新手程序員,我很難感謝任何意見與我的問題在這裏。C字符串引用voodoo

我做了一個過程,它在得到緩衝的字符串並解析它在三個cunks,由第一2「;」分隔。

我試圖做的是傳遞3個字符指針,在那裏我將存儲我的分析字符串。但是我在調​​用函數中得到的只是內存垃圾。我究竟做錯了什麼?

void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje){ 

    char *temp; 
    temp=(char *)malloc(sizeof(buf)); 


    strcpy(temp, buf); 
    printf("\ntemp adentro de la funcion = %s\n", temp); 
    idNodo = strtok (temp,";"); 
    idMensaje = strtok (NULL, ";"); 
    mensaje = strtok (NULL, "\0"); 

    printf("\nADENTRO\nidNodo: %s\nidMensaje: %s\nmensaje: %s", idNodo, idMensaje, mensaje); 

} 

調用該函數是這樣的:

 char *idnod=NULL; 
    char *idmen=NULL; 
    char *men=NULL; 

    idnod=(char *)malloc(sizeof(buffer)); 
    idmen=(char *)malloc(sizeof(buffer)); 
    men=(char *)malloc(sizeof(buffer)); 

    parseomensaje (buffer, &idmen, &idnod, &men); 

後parseomensaje執行緩衝區包含其原始的字符串,但idmen,idnod和男人是空白。我正在閱讀指南,指針名稱是指針本身,所以這是通過引用傳遞參數,但在字符串的情況下,我需要將指針地址傳遞給指針的指針... ...一樣的東西... I was reading it from here,但我仍試圖找出答案。

PD:我很抱歉,我的英語水平,請隨時指向任何錯誤在我的寫作。 :)

+0

不是你的問題的解決方案,但永遠不會由'malloc'返回的指針指針 – Michael

+0

緩衝區的大小是多少? –

回答

3

這是不正確的:

char *temp; 
temp=(char *)malloc(sizeof(buf)); 

作爲陣列將降低到函數內的一個char*,所以只sizeof(char*)字節被分配(通常48或字節)。如果buf的實際長度大於48字節,則程序具有未定義的行爲,因爲strcpy()將寫入超出數組範圍。基本上是:

void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje){ 

等同於:

void parseomensaje(char* buf, char **idNodo, char **idMensaje, char **mensaje){ 

如果你是,正如你所說,一個新手程序員,我會建議避免動態內存分配,直到你獲得更加舒適的語言。修改程序以使用固定大小的數組而不是動態分配的內存(並防止超出數組邊界的寫入)。一旦你有這個工作,並充分理解它,然後嘗試使用動態分配的內存。

+0

感謝您的回覆,我確實無法與malloc合作,但如果我評論該句子,我得到了SegFault錯誤。但我相信我完全負責:) – Zeke

+0

@ user3306636,如果您只取消註釋'malloc',那麼'temp'是一個單位指針。內存需要複製到:'char temp [256];'例如。 – hmjd

0

首先,您的程序中有多個內存泄漏。一旦你不再需要它們,請考慮釋放你已經分配的每一個內存塊,這要歸功於malloc

至於把你的函數:

void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje) 

爲什麼你傳遞你的函數指針char**?改爲通過char*。由於strtok聲明是這樣的:

char *strtok(char *str, const char *delim); 

而且,你不需要調用parseomensaje以來的strtok返回一個指向你自己的記憶,而不是新分配的一個前分配任何內存。

+0

'char **'被傳遞給函數,所以調用者可以看到變化,除非使用'strcpy()'來填充參數(它應該是這樣)。 – hmjd

+0

@hmjd在這種情況下,在調用用戶函數之前,不應該執行分配的內存。 –

+0

這是正確的。我相信OP錯誤地認爲'='會複製字符串。 – hmjd