如何在C中动态分配字符串数组?

时间:2011-10-04 18:19:17

标签: c

如果我有一个名为“totalstrings”的var中的项目数和一个名为“string size”的var,它是每个项目的字符串大小,我该如何动态分配一个名为“array?”的数组?

这是C中的字符串数组,而不是C ++。

谢谢!

5 个答案:

答案 0 :(得分:20)

注意:我的示例不检查malloc()的NULL返回...但是你真的应该这样做;如果你尝试使用NULL指针,你会崩溃。

首先,您必须创建一个char指针数组,每个字符串对应一个字符串(char *):

char **array = malloc(totalstrings * sizeof(char *));

接下来,您需要为每个字符串分配空间:

int i;
for (i = 0; i < totalstrings; ++i) {
    array[i] = (char *)malloc(stringsize+1);
}

当您使用完阵列后,您必须记住free()您分配的每个指针。也就是说,遍历数组,在每个元素上调用free(),最后调用free(array)

答案 1 :(得分:11)

用于分配任何类型T的N×M阵列的常用习语是

T **a = malloc(N * sizeof *a);
if (a)
  for (i = 0; i < N; i++)
    a[i] = malloc(M * sizeof *a[i]);

从1989年的标准开始,您不需要转换malloc的结果,事实上这样做被认为是不好的做法(如果您忘记包含stdlib.h,它可以抑制有用的诊断否则在范围内没有malloc的原型。早期版本的C有malloc返回char *,所以演员是必要的,但是你必须使用1989年之前的编译器的几率非常遥远。 C ++ 确实需要强制转换,但如果你正在编写C ++,那么你应该使用new运算符。

其次,请注意我正在将sizeof运算符应用于正在分配的对象;表达式*a的类型为T **a[i]的类型为T(在您的情况下,T == char )。这样您就不必担心保持sizeof表达式与正在分配的对象的类型同步。 IOW,如果您决定使用wchar而不是char,则只需在一个地方进行更改即可。

答案 2 :(得分:4)

char** stringList = (char**)malloc(totalStrings * sizeof(char*));

for( i=0; i<totalStrings; i++ ) {
  stringList[i] = (char*)malloc(stringSize[i]+1);
}

答案 3 :(得分:0)

好吧,首先你可能想为“数组”分配空间,这将是一个char *数组,其长度为“totalstrings”。

那么“数组”中的起始和最终索引是什么?你知道第一个是0;什么是最后一个?

然后,对于“数组”中的每个条目,你可以(如果你想的话)分配一个内存区域,即“stringsize + 1”(为什么+1,祈祷告诉我?)long,将起始地址设置为area - 该字符串 - 成为“数组”的正确成员。

那将是一个好的开始,imo。

答案 4 :(得分:0)

我知道这个问题很老,已经有人回答了。我只想指出 malloc 是一个系统调用,不应多次使用。

最好分配一大块内存并使数组指向它。像这样:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STR_SIZE 100 //STR_SIZE doesn't have to be a constant

int main(){
        int i;
        char **arr;
        char *long_string;
        long_string = (char *)malloc(sizeof(char)*STR_SIZE*10);
        arr = malloc(sizeof(char *)*10);

        //Pointing each item of the array to an allocated memory. 
        for (i=0; i<10; i++){
                arr[i] = (long_string + STR_SIZE * i);
        }

        //Initialising the array
        for (i=0; i<10; i++){
                strcpy(arr[i], "This is a line in a\
 paragraph\n");
        }

        //Printing the items of the array
        for (i=0; i<10; i++){
                printf("%s \n", arr[i]);
        }

        //freeing the allocated memory
        free(long_string);
        free(arr);

        return 0;
}