【问题标题】:How do I use malloc() to allocate memory to store an array of strings?如何使用 malloc() 分配内存来存储字符串数组?
【发布时间】:2018-09-26 20:38:08
【问题描述】:

我正在尝试创建一个程序,该程序使用通过终端传递的参数填充固定大小的参数数组。我的第一步是尝试创建和填充默认参数字符串数组,我已经成功地做到了。但是,我现在尝试使用malloc() 为该数组分配空间,但无法编译。我已经尝试了所有我能想到的关于正确语法的方法。我已经尝试对malloc() 以及如何将其用于二维数组进行更多研究,但我没有找到任何对我有帮助的信息。我被困住了,不知道下一步该怎么做。代码如下:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MAX_NUM_OF_ARGS 5
#define MAX_ARG_SIZE 256

int main(int argc, char **argv) {
    printf("%s%d\n", "Length: ", argc); //for debug purposes

    // Make sure we don't have more than five arguments
    if(argc > MAX_NUM_OF_ARGS) {
        printf("%s", "Too many arguments. Must enter fewer than 4.");
    }
    // Populate the array
    else{
        char defaultArgs[] = "defaultArgs"; //create default argument array

        //allocate memory for default array
        char argumentArray[MAX_NUM_OF_ARGS][MAX_ARG_SIZE] =
            (char *)malloc(MAX_NUM_OF_ARGS * MAX_ARG_SIZE * sizeof(char));

        //populate array with default arguments
        for (int i = 0; i < MAX_NUM_OF_ARGS; i++) {
            strcpy(argumentArray[i], defaultArgs);
            printf("%s\n", argumentArray[i]);
        }

        free(argumentArray);
        return 0;
    }
}

当我尝试编译时,在 malloc() 的 (char*) 转换中出现无效的初始化程序错误。我尝试将其转换为 (char**) 和 (char) 并将 sizeof(char) 更改为 sizeof(char*)sizeof(char**)

我现在不确定自己做错了什么,甚至不知道下一步该尝试什么。

【问题讨论】:

  • char **argvmain() 中声明,但在代码中未使用。这是你的意图吗?
  • @chux 稍后将用于使用来自终端的参数填充数组。我还没走到那一步。
  • 布莱克·西蒙斯,现在考虑that 仍然有用,如果strlen(argv[i]) &gt;= MAX_ARG_SIZE 会发生什么?

标签: c arrays string pointers malloc


【解决方案1】:

您已将argumentArray 声明为char 的二维数组。 malloc 函数返回一个指针,因此您不能将指针分配给该数组的元素。

您需要一个指针来存储返回的内容。实际上,在这种情况下,您需要一个指向指针的指针,并且您需要多次调用 malloc,一次用于参数的指针数组,然后再次在循环中为每个参数调用:

char **argumentArray = malloc(MAX_NUM_OF_ARGS * sizeof(char *));

for (int i=0; i<MAX_NUM_OF_ARGS; i++) {
    argumentArray[i] = malloc(MAX_ARG_SIZE);
    strcpy(argumentArray[i], defaultArgs);
    printf("%s\n", argumentArray[i]);
}

【讨论】:

    【解决方案2】:

    您不能在 C 中存储字符串数组,因为字符串是可变长度数据结构,而不是简单类型。
    所以,决定你想要什么:

    1. 一组固定长度的缓冲区,存储固定(最大)长度的字符串。

      char (*p)[MAX_LEN] = malloc(n * sizeof *p);
      // Store the strings at p[0], p[1], …, p[n - 1]
      
    2. 连续存储任意数量的字符串的缓冲区。

      char* p = malloc(sum_of_string_lengths + count_of_strings);
      // Now fill in the strings one after the other, including Terminator
      
    3. 指向字符串的指针数组。

      char** p = malloc(n * sizeof *p);
      p[0] = strdup(source[0]);
      // ...
      // p[n - 1] = ...
      

      使用strdup(),通用实用程序函数定义如下:

      char* strdup(const char* s) {
          size_t n = strlen(s) + 1;
          char* r = malloc(n);
          if (r)
              memcpy(r, s, n);
          return r;
      }
      

    【讨论】:

      【解决方案3】:

      试着这样想:

      • 字符串是字符指针
      • 您需要一个字符指针数组

      这是一个示例,其中我创建了一个 char * 数组。本质上, malloc 返回的指针指向 char * 将驻留的区域。这是正在发生的事情的图示。

      /*
          malloc_ret_ptr  --->  [ char * my_str1 | char * my_str2 |  char * my_str3 ]
                                         |                |                 |
                                         |                |                 |
                                         v                v                 v
                                        "Thank"           "You"            "Chicago"
      */
          int main() {
      
                char * my_string = "this is my string";
      
                char ** my_string_array;
      
                my_string_array = malloc(sizeof(char*)*10); //Create an array of character pointers
      
                //Place char * inside of char * array
                my_string_array[0] = my_string;
      
                return 0;
              }
      

      【讨论】:

      • 好的,我想我明白这里发生了什么,但我想问一些问题来澄清一下。首先,为什么不需要强制转换 malloc?我到处都被告知需要将 malloc 转换为数据类型。其次,似乎我只是为指针本身腾出空间,而不是为指针和它们指向的字符串分配空间。这不正确吗?
      • @BlakeSimmons "我看到的每一个地方都被告知需要将 malloc 转换为数据类型" --> Do I cast the result of malloc?。不需要演员表。您查看的位置的示例是什么?
      • 布莱克,你是对的,我在图片中显示的 malloc 调用正在为指针腾出空间。这正是它正在做的事情。我放在数组中的字符串是字符串文字,我不需要为它分配空间。如果确实需要为字符串分配空间,则可以调用 malloc 为字符串分配空间,然后将返回的指针存储到数组中。希望对您有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      相关资源
      最近更新 更多