2012-04-06 51 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