在C中维护字符串数组的更好方法

时间:2011-03-08 22:49:28

标签: c pointers

除了使用typedef char *并声明一个string类型的数组之外,还有更好的方法来维护C中的字符串列表吗?我正在尝试管理通过套接字程序加入该组的成员名称列表。但每次新成员加入该组时,旧成员名称都会被覆盖。部分示例代码如下:

typedef char * string;
string  List[10];

和新成员加入如下:

List[index]=membername;

感谢。

4 个答案:

答案 0 :(得分:2)

对于基本的C类型,您需要将List作为指针指针,然后为每个新成员名称重新分配它作为另一个字符串(或将其设置为常量最大字符串数量 - < strong>可能导致令人讨厌的内存溢出 - 但如果你调整索引是安全的。)

  • 对于每个新成员名称,您需要为此成员名称分配char*(c字符串),如果您只想存储此成员名称,则可以使用malloc(strlen(membername)+1)为其分配空格null终止0。

  • 完成此操作后,您将有内存插入字符串,请按strcpy(List[index++], membername)执行此操作。

  • 如果你选择静态最大数量的字符串,你必须使用strpcy(List[(index++)%ALLOCATEDSTRINGS,membername)

答案 1 :(得分:2)

这完全取决于membername的分配方式。如果它是您重复使用的静态字符串,每次进入时都会使用新名称填充它,那么您将多次覆盖该字符串。存储指向字符串的指针不会存储字符串的内容,只会保存其地址。

要正确执行此操作,您需要为每个新名称分配(使用malloc())新字符串。然后将每个新的字符串指针分配给数组中的不同成员。

答案 2 :(得分:1)

你可能(没有足够的上下文)没有正确分配字符串。

string List[10];

仅分配10 string的数组,即10 char *,即10个字符指针。它不为字符串本身分配任何存储空间。

因此,如果您的上述membername是您正在将数据从网络复制到的全局char *List中的所有广告位将最终指向非常相同的内存位置

要使其正常工作,您需要分配(并小心释放)List中的所有广告位。类似的东西:

List[index] = strdup(membername);

为了更好地及早发现错误,最初将List设置为所有空指针。

for (int i=0; i<10; i++) List[i] = NULL;

当用户“离开”时,释放并将该插槽重置为NULL:

free(List[index]);
List[index] = NULL;

如果你不仔细管理你的插槽,那么你会得到很好的,令人讨厌的段错误: - )

答案 3 :(得分:0)

我将使用已分配的char *数组,如果需要,可以使其动态增长数组。

所以你有:

char **List = calloc(num_members,sizeof(char *));

然后当有人加入你所拥有的小组时:

List[current_index] = calloc(strlen(new_user_name) + 1,sizeof(char));
strcpy(List[current_index++],new_user_name);

请记住,num_members需要开始足够大以处理可能想要加入的成员,或者您不得不偶尔重新分配更大的阵列。