【问题标题】:How do I dynamically allocate an array of strings in C?如何在 C 中动态分配字符串数组?
【发布时间】:2011-10-04 18:19:17
【问题描述】:

如果我有一个名为“totalstrings”的变量和一个名为“字符串大小”的变量(即每个项目的字符串大小)中的项目数,我如何动态分配一个名为“数组”的数组?

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

谢谢!

【问题讨论】:

  • 这取决于您可能尝试过什么以及没有什么效果。
  • 当然还有为什么你认为它不起作用。

标签: c


【解决方案1】:

注意:我的示例没有检查 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)

【讨论】:

  • 但是 malloc 返回 NULL 通常是一个太严重的错误,无法继续,无论如何。我们不想过于偏执,不是吗?真正错误的是malloc 的返回值的转换,这在C 中是完全不必要的,通常是不好的做法(但没关系,我也来自C++ 背景)。否则很好的答案。 +1 正确地记住free
  • 确实,如果忘记包含 ,在 C 中强制转换 malloc 结果会很危险。否则很好回答。
  • 如果每个字符串都有不同的大小,比如说,我正在尝试存储一个名称列表
  • @Aadishri 没问题;您不需要每个字符串 malloc 的大小相同,您可以根据需要调整它们的大小。
  • @sivaram 您必须至少有一个初始数量的字符串才能开始,并且您需要保留一个具有当前数组大小的变量。如果你以后需要扩大空间,你可以realloc()你的数组到更大的尺寸。
【解决方案2】:

分配任何类型 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,您只需在一处进行更改。

【讨论】:

    【解决方案3】:
    char** stringList = (char**)malloc(totalStrings * sizeof(char*));
    
    for( i=0; i<totalStrings; i++ ) {
      stringList[i] = (char*)malloc(stringSize[i]+1);
    }
    

    【讨论】:

      【解决方案4】:

      我知道这个问题已经过时并且已经得到解答。我只想指出,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;
      }
      

      【讨论】:

        【解决方案5】:

        好吧,首先您可能想为“array”分配空间,它是一个长为“totalstrings”的 char * 数组。

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

        然后,对于“array”中的每个条目,您可以(如果需要)分配一个长度为“stringsize+1”(为什么是 +1,请告诉我?)的内存区域,并将其起始地址放在区域——那个字符串——进入“数组”的正确成员。

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

        【讨论】:

          猜你喜欢
          • 2015-03-09
          • 1970-01-01
          • 2015-07-14
          • 2013-03-09
          • 2011-10-21
          • 1970-01-01
          • 2020-12-09
          相关资源
          最近更新 更多