2010-10-27 60 views
1

假設我具有類似於此的一段代碼擋土牆C內存:整個函數

SOMESTRUCTURE *info; 
info = malloc(sizeof(SOMESTRUCTURE)); 

while(something...) 
{ 
    info->mini[0] = malloc(sizeof(SOMESTRUCTURE *)); // It's a structure inside the same structure 
    while(something...) 
    { 
      info->mini[x]->name = malloc(sizeof(char *)*strlen(name)); 
      printf("%s\n", info->mini[0]->name); // This prints out the correct value 
    } 
} 

printf("%s\n", info->mini[0]->name); // But now the value is lost and is null 

我怎樣才能使信息 - >微型[0] - >名稱值應用於整個功能?

+0

這非常混亂。給一些適當的代碼。 – slashmais 2010-10-27 07:05:13

+3

當看到'malloc(sizeof(char *)* n)'時,別人的鐘聲響了嗎? – 2010-10-27 07:08:19

回答

3

不,這應該仍然可用。如果x在您的while循環的某個迭代中爲0,或者如果您在外循環內執行malloc而不進入內循環,則可能會失去該值的唯一方法 - 很難判斷這是否可能,因爲您不能在這兩種情況下,都不指定什麼something

確實,在特定範圍內創建的變量在您退出該範圍時將消失,但在此情況並非如此。分配的內存將在範圍更改後生存。在這種情況下,給定的指針可能不是您的指針(當您退出外部while語句時,info仍處於範圍內)。

我確實看到另一個潛在的問題 - 您的malloc(sizeof(char *) * strlen(name))應該可能是malloc(strlen(name) + 1)(因爲sizeof(char)始終爲1)。這可能是有效的,因爲char *通常會比char大,但它仍然是錯誤的做法。

不過,我看不到在你的代碼,你居然設置info->mini[0]->name到任何東西,所以我不知所措它是如何永遠不會有一個正確的值,除非它以某種方式從以前的拿起值的任何地方malloc(這是可能的,因爲malloc本身並不需要清除它給你的內存)。

您應該發佈您的實際代碼或最好是顯示問題的最小代碼片段。

+0

buf的名字被分配在循環中,所以x在某個階段必須爲零。他的代碼太雜亂和不完整,無法做出任何有價值的假設。 – slashmais 2010-10-27 07:07:06

+0

只需使用'malloc(strlen(name)+ 1)'是我知道的一個動態分配字符串的唯一合理用法... – 2010-10-27 07:35:02

+0

好點@Jens,現在我真的應該更好地瞭解:-) – paxdiablo 2010-10-27 07:43:31

0

我看到你分配了info->mini[x]->name,然後在下一行打印出來。

在這兩者之間,你似乎沒有將的任何數據放入->name,所以我不知道它如何才能打印出正確的值。

您分配的->name取決於當時的價值x。但你永遠不會顯示我們x被宣佈,或其價值被設置。

請向我們介紹有關x的聲明和作業以及數據實際複製到->name的信息。

1

我建議你使用巧舌如簧的g_strdup功能,見API - 你會在巧舌如簧許多有用的功能找到處理字符串:

所以你的情況來複製字符串name你只是做。 ..

info->mini[x]->name = g_strdup(name); 

編輯 作爲評論...您可以使用標準strdup獲得相同的功能:

info->mini[x]->name = strdup(name); 

末版

通過這樣做,info->mini[x]->name將指向一個動態分配的內存空間,將提供您的功能之外 - 除非你免費吧。

如果你不想使用巧舌如簧則:

info->mini[x]->name = malloc(sizeof(char) * (strlen(name) + 1)); 
strcpy(info->mini[x]->name,name); 

在這種情況下,記住,malloc的是sizeof(char)因爲一個字符串的字符不char *的數組,你收到了。 +1是保存空字符結束的最後一個字符。

+2

或者,因爲大量的C實現_have_'strdup()',請使用它。或者,如果你的實現沒有,只需寫一個(http://stackoverflow.com/questions/252782/strdup-what-does-it-do-in-c/252802#252802),而不用擔心試圖合併'glib'。使用glib有很多很好的理由,像strdup這樣的小東西不是其中之一:-) – paxdiablo 2010-10-27 08:15:19

+0

當然@paxdiablo,我的觀點是glib中有很多有用的函數來處理字符串。但是,我同意你的看法,glib中有許多其他功能使它成爲一個非常有用的庫。編輯答案使得只使用簡單的strdup也是一個不錯的選擇。並對您的評論+1。乾杯。 – 2010-10-27 08:59:30