2010-01-24 47 views
0

我試圖創建一個程序,它接收一組字符串(用戶被要求輸入它們將輸入的字符串的數量),一旦它有這些字符串,它們被放置在一個數組中,使用動態內存。用C中最後一個覆蓋的數組元素

的輸出中會是這樣的:

# of Strings: 3 
Cat 
Dog 
Elephant 

Cat 
Dog 
Elephant 

繼承人我的代碼片段,之後我有一個字符串的數量。

sptr=malloc(sizeof(char*)*nStrings); 

for(i=0;i<nStrings;i++) 
{ 
    scanf("%s",string); 
    length=strlen(string); 
    sptr[i]=malloc(sizeof(char)*length); 
    sptr[i]=string; 
} 

其中sptr是數組,我將訪問以輸出字符串。 所以它是一個指向數組的指針數組,指向單個字符串(或其他字符數組,如果您希望這樣想)。

可以說有兩個字符串。 我分配內存的兩個指針, 然後在第一個指針,我掃描一個字符串, 我發現字符串的長度, 我分配內存的字符串的大小 和我等於指向字符串的指針。 這一切都很花哨,如果我在最後一行之後放一個printf(),它就會起作用。 我面對的問題是,如果讓我們說有3個字符串,每次通過sptr [i]分配正確,但在該塊之外,所有sptr的指示都是=我放入的最後一個字符串,並且我不知道爲什麼。

如果你能幫助我,我會很感激。謝謝。

+1

正如答案所暗示的,'sptr [i] = string;'分配指針,而不是它指向的內存。如果您重複使用相同的內存來讀取字符串,那麼數組中的每個元素都將指向內存中的相同位置,因此它們將打印相同的字符串。更喜歡strcpy的srtncpy,不太容易將一個字符串複製到一個較小的緩衝區並獲得一個內存溢出。希望這可以幫助。 – 2010-01-24 18:11:02

+0

謝謝,這完美澄清了事情。如果僅僅因爲它是我們在課堂上使用的,我會使用strcpy。我正在考慮完全回答的問題。男人,我喜歡這個社區。 – Blackbinary 2010-01-24 18:40:57

回答

1

您需要分配1個字符額外的空終止:

sptr[i]=malloc(sizeof(char)*(length+1)); 

此外,您還需要將字符串複製到新分配的內存:

strcpy(sptr[i], string); 
0

strlen不佔用零終止,您需要添加一個。但主要是需要將字符串複製到您分配的內存中。

1

有2個問題,你代碼:你沒有分配足夠的內存。由於字符串中的結尾\ 0,因此應該是長度+1。其次,您應該使用strcpy將字符串複製到您分配的內存中。查找處理兩者的strdup函數。

2
sptr=malloc(sizeof(char*)*nStrings); 

for(i=0;i<nStrings;i++) 
{ 
    scanf("%s",string); 
    sptr[i]=strdup(string); 
} 

我假設變量字符串有足夠的內存來保持讀取字符串。

由於您將指針設置爲指向字符串變量,因此發生錯誤。

+0

您可以擴展您的答案嗎?我設法讓它工作,但是我不知道什麼是strdup(或者需要庫)。我用strcpy代替。問題是,我不明白爲什麼會導致錯誤。是不是sptr [我]被視爲一個字符串?謝謝你的回答,但它確實有幫助。 – Blackbinary 2010-01-24 18:35:14

+0

strdup在string.h中定義 函數原型: char * strdup(const char * s); 聲明 sptr [i] = strdup(string); 相當於 sptr [i] = malloc(sizeof(char)*(strlen(string)+1)); strcpy(sptr [i],string); 你所做的沒有工作的原因是,通過將變量字符串分配給sptr [i],您確實將指向字符串的指針指定給了sptr數組單元格。 所以你所做的就是讓每個單元的sptr指向字符串。 但是由於字符串的內容在每次迭代後確實發生了變化,所以在退出循環後,所有變量都具有相同的內容,這是您讀取的最後一個字符串。 – George 2010-01-24 20:27:52

相關問題