Как использовать malloc () для выделения памяти для хранения массива строк? - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь создать программу, которая заполняет массив аргументов фиксированного размера, используя аргументы, передаваемые через терминал.Мой первый шаг - попытаться создать и заполнить массив строк аргументов по умолчанию, что мне удалось сделать.Однако сейчас я пытаюсь использовать 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 голосов
/ 26 сентября 2018

Попробуйте думать об этом так:

  • Строки - это указатели символов
  • Вам нужен массив указателей символов

Вот пример, гдеЯ делаю массив char *.По сути, указатель, возвращаемый функцией malloc, указывает на область, в которой будет находиться символ *.Вот иллюстрация того, что происходит.

/*
    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;
        }
0 голосов
/ 27 сентября 2018

Вы не можете хранить массив строк в 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;
    }
    
0 голосов
/ 26 сентября 2018

Вы объявили 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]);
}
...