2013-10-08 222 views
1

我在這裏有一些奇怪的輸出。你能解釋我爲什麼以及如何解決它?C字符串malloc(輸出)

int inp_str(char * string, char ** pointers[]) 
{ 
    char * tmp[stringsCount]; 
    if (strlen(string) > maxlen) 
    return (-1); 
    else { 
    tmp[count] = malloc(sizeof(char) * strlen(string)); 
    strcpy(tmp[count], string); 
    pointers[count] = &tmp[count]; 
    count++; 
    } 
    return count; 

} 


int main(){ 

    //char * strings[stringsCount]; 
    char ** pointers[stringsCount]; 
    inp_str("sdasya", pointers); 
    inp_str("dasd", pointers); 
    inp_str("qwe", pointers); 
    inp_str("dasd", pointers); 

    //sort(pointers, count); 
    printf("%s", *pointers[0]); 
    printf("\n%s", *pointers[1]); 
    printf("\n%s", *pointers[2]); 
    printf("\n%s", *pointers[3]); 
} 

這裏是輸出:

sdasya 
��uNH��H�l$ H�\$L�d$(L�l$0H��8�f.� 
qwe 
�bs7 

PS。 stringsCount是常量; count = 0

+0

歡迎來到Stack Overflow。請儘快閱讀[關於]頁面。您應該瞭解如何創建SSCCE([簡短,獨立,正確的示例](http://sscce.org/))。你的代碼與SSCE相當接近,但它看起來只需要四行代碼即可完成:兩條'#include'行和'stringsCount'和'count'的定義。包括那些將會節省你編寫最後一條PS線。 –

回答

3

由於char * tmp[stringsCount];是一個局部變量,在函數inp_str返回後,系統回收tmp的內存。所以指向該位置的指針在函數返回後無效。

+0

感謝您的快速回答,它的工作原理 – user2858814

0

我不知道我明白你在這裏要做什麼。但在任何情況下,都有幾個問題:

1)您正在將字符串複製到未初始化的指針中。即您可以創建一個指向)的(char *)列表,然後將該字符串複製到該位置。如果你想把tmp指向你的字符串,不要使用strcpy,只需通過tmp [count] = string;

2)在堆棧上創建了tmp,所以如果你將它的值賦給指針**並嘗試引用此函數範圍之外的地址,那麼這個內存就不見了,你可能會看到損壞的數據。

希望這會有所幫助。出於好奇,你想在這個功能上做什麼?

+0

謝謝,這有助於。函數用於處理輸入字符串:創建指針(用於快速排序的指針數組),返回指針/字符串數。 – user2858814

0

除了函數返回後失去tmp[]指針,你也總是短分配實際需要的量的一個字節:strlen(s)返回一個字符串的長度,這確實不包括終止NUL字節。 (注意的sizeof(char)的1 定義),你需要的是:

char *p = malloc(strlen(string) + 1); 
    strcpy (p, string); 

複製一個字符串。

+0

爲什麼不malloc(strlen(string)* sizeof(char)+ 1)? – user2858814

+0

@ user2858814因爲如前所述,sizeof(char)的定義是1。總是。在任何編譯器上。它永遠不會是一個不同的價值。乘以1是毫無意義的,也是不能理解C型系統的一個說明。 – Jens