2012-04-06 40 views
0

我想在C程序中編寫更高效的代碼,並且我需要一些幫助才能使指針和賦值正確。我展示下面兩種方法中,每個使用下面的聲明和函數strncpy:C程序:定期與不規則字符串數組

int kk, arraysize; 
char person_name[100] = ""; 
char * array_person_name, * array_param; 
... 
strncpy(person_name, "John Smith", 100); 
arraysize = <this value is downloaded from database>; 
... 

方法A(矩形陣列):

array_person_name = malloc(sizeof(char) * arraysize *100); 
array_param = malloc(sizeof(char) * arraysize * 2); 
for (kk = 0; kk < arraysize; kk++) { 
    strncpy(array_person_name[kk], person_name, 100); 
    strncpy(array_param[kk], "bt", 2); 
} 

方法B(粗糙​​的陣列):

for (kk = 0; kk < arraysize; kk++) { 
array_person_name[kk] = &person_name; 
array_param[kk] = "bt"; 
} 

請注意,我試圖創建的數組將相同的值放入數組的每個元素中。方法A是arraysize元素的一個(矩形)數組,每個元素本身是一個由100個字符組成的數組。方法B通過創建一個arraysize元素(不齊整的)數組來嘗試不浪費存儲空間,其中每個元素都是一個指向字符的指針。

問題1:我在方法A中正確分配內存(例如malloc)嗎?

問題2:方法B的語法看起來是否正確?

問題3:如何爲方法B中的數組分配內存?

問題4:我確定方法B通常是首選嗎?

+1

注意:您對'strncpy()'的使用是錯誤的(但是文字示例沒問題)。爲了安全地使用'strncpy()',你應該複製1小於目標數組的大小,並用'\ 0'填充最後一個元素。否則就會冒着產生不是字符串的字符數組的風險。 – pmg 2012-04-06 21:07:25

+1

您的方法A代碼沒有正確使用您的存儲,因爲您的變量類型錯誤,它們需要例如'char(* array_person_name)[100];'和'char(* array_param)[2];'。 – Neil 2012-04-06 22:51:17

回答

1

你離這裏很遠。 1:是,2:不,3:不,4:是。我不打算這樣做,但這裏有一些提示。

您需要空間來存儲字符串和空間以存儲指向字符串的指針(後者對於方法A並不是必需的)。第一種類型爲char*,第二種類型爲char**

對於方法A,您正在正確分配字符串存儲空間,但是您需要正確分配字符串指針的存儲空間(提示:您需要char*指針的arraysize實例)。然後它被初始化爲彼此相差100個字符的指針。

對於方法B,沒有簡單的方法來分配空間來存儲字符串,因爲您不知道需要多少空間。你可以迭代所有的字符串來計算它們的長度,或者每個字符串做一個malloc,或者使用固定大小的塊並在用完時分配更多。

方法B使用與方法A相同的字符串存儲指針數組。您需要將字符串指針分配到數組中,一旦您知道它們將到達何處。

+0

感謝Keith,關於'對於方法A,您正確地分配字符串存儲,但是您需要正確地爲字符串指針分配存儲空間(提示:您需要char *指針的數組實例)。然後它被初始化爲彼此相差100個字符的指針。那麼不是方法B使用與方法A相同的存儲空間(例如兩個矩形陣列)? – ggkmath 2012-04-06 21:20:00

+0

它們都爲*字符串指針*使用相同的存儲空間,但不是*字符串*本身。換句話說,對於字符串指針存儲,每個字符串都使用4個字節(如果您運行64位,則使用8個字節)。方法A每個字符串使用額外的100個字節,而方法B只使用所有字符串的總長度(每個字符串加上字符串終止符一個字節)。 – 2012-04-06 21:22:40