Это правильный способ выделить память? - PullRequest
0 голосов
/ 06 сентября 2018

Я сталкивался с этим в чьем-то коде ... Я не знаю, правильно ли это (потому что даже если это выглядит неправильно, это работает).Может ли кто-нибудь уточнить, правильно ли это или нет, почему так и почему оно все равно работает?


Короче говоря, мы хотим сохранить все аргументы (заданные как командная строка), объединенные, в 1строка.

Примечание: каждая строка имеет хотя бы 1 символ.


Фрагмент:

int main(int argc, char **argv) {

    // Declaring a pointer to a string
    char *desintation_string;

    // Allocating enough memory to store all arguments (given as command-line) concatenated 
    destination_string = malloc((argc) * sizeof(char));   /* <————— is this correct ? does 
                                                                    it indeed allocate
                                                                    enough memory to fit
                                                                    all the arguments
                                                                    concatenated ? */
    . . . 
}

Вопрос в следующем:

Распределяет ли эта строка "destination_string = malloc((argc) * sizeof(char));" достаточно памяти для этого?

Может кто-нибудь объяснить, что именно это делает?Потому что я читал это как: он выделяет (argc * 1 байт).Тем не менее, когда вы запускаете его и копируете в него аргументы, это работает, может кто-нибудь объяснить это тоже?

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Нет. Скажите, что ваши аргументы "foo" "bar". Это составляет argc = 2. С malloc((argc) * sizeof(char)) в этом случае вы выделяете память только для 2 символов.

argv - это двумерный массив (следовательно, argv**). Вам нужно проверить длину каждого аргумента кулак, чтобы выделить для них память.


Что malloc((argc) * sizeof(char)) делает: argc - количество аргументов, которые вы передаете. sizeof(char) возвращает количество байтов, которое необходимо выделить для переменной типа char. Итак, вы получите malloc(<number of bytes needed to store argc number of char variables>). malloc() выделяет это количество байтов в куче.

0 голосов
/ 06 сентября 2018

Ваш код будет работать только для коротких типов аргументов (т.е. -x). Но для аргументов длинного типа (т. Е. --list) это не удастся.

Вот как вы можете это сделать.

int main(int argc, char **argv) {

    // Declaring a pointer to a string.
    char *desintation_string;
    int Arg_Size = 0;

    // Allocating enough memory to store all arguments concatenated.
    // argv[0] is path not argument given in command line
    for (int i=1, i <= argc, i++)
        Arg_Size += sizeof(argv[i]);

    destination_string = malloc(Arg_Size); 
    . . . 
}
0 голосов
/ 06 сентября 2018

Имеет ли эта строка "destination_string = malloc ((argc) * sizeof (char));" выделить достаточно памяти для этого?

Нет . Вам нужно выделить достаточно памяти. например здесь

#define BUFSIZE YOUR_EXPECTED_SIZE

destination_string = malloc((BUFSIZE) * sizeof(char));

например, командная строка: a.out foo bar

snprintf(foo, 1024, "%s - %s\n", argv[1], argv[2]);
...