如何使用malloc()分配内存以存储字符串数组?

时间:2018-09-26 20:38:09

标签: c arrays string pointers malloc

我正在尝试创建一个程序,该程序使用通过终端传递的参数来填充固定大小的参数数组。我的第一步是尝试创建并填充默认参数字符串数组,这是我成功完成的。但是,我现在正尝试使用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;
    }
}

当我尝试编译时,在char*的(malloc())强制转换时收到无效的初始化错误。我尝试将其强制转换为(char**和(char),还将sizeof(char)更改为sizeof(char*)sizeof(char**)

我现在还不确定我做错了什么,我甚至不知道下一步该怎么做。

3 个答案:

答案 0 :(得分:2)

您已将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]);
}

答案 1 :(得分: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;
    }
    

答案 2 :(得分:0)

尝试这样思考:

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

这里是一个使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;
        }