Есть ли способ выделить память в C и инициализировать во время процесса выделения значение, отличное от 0? - PullRequest
0 голосов
/ 10 ноября 2019

Интересно, есть ли способ инициализировать строковый массив значением, которое я выбрал при распределении памяти, чтобы он не содержал мусора, и нулевой символ будет помещен в правильное место. Я знаю, что при использовании calloc выделенная память инициализируется для всех нулей, но в этом случае с использованием строк это не помогает.

Я практикую использование указателей и выделения памяти в C. Есть упражнение, в котором я написалфункция для копирования строки в другую строку. В main () я выделяю память с помощью malloc для обеих строк на основе длины строк, которую предоставляет пользователь, а затем пользователь вводит первую строку. На этом этапе я посылаю указатель первой строки и второй строки (неинициализированный) в качестве параметров в strCopy (char * str1, char * str2). Внутри этой функции я также использую другую основную функцию, которую я написал, чтобы вычислить длину строки. но, как вы можете догадаться, поскольку вторая строка заполнена мусором, вычисление ее длины внутри функции запутано.

void strCopy(char* str1, char* str2)
{
    int str1len = str_len(str1); // basic length calculating function
    int str2len = str_len(str2);

    int i;

    for (i = 0; i < str2len; i++)
    {
        str2[i] = str1[i];
    }
    str2[i] = '\0';

    if (str2len < str1len)

    printf("There wasn't enought space to copy the entire string. %s was 
copied.\n", str2);

    else
        printf("The string %s has been copied.\n", str2);

}

В данный момент все работает нормально при инициализации str2 в цикле в main (),но меня интересуют другие возможные решения.

Большое спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 10 ноября 2019

Нет, нет. Вы должны вручную инициализировать его.

Если вы хотите скопировать строку при выделении памяти, вы можете использовать strdup. Обратите внимание, что это функция POSIX, что означает, что она будет работать только в POSIX-совместимых операционных системах, Windows и любых других ОС, которые ее реализуют.

0 голосов
/ 10 ноября 2019

Ну, для этой конкретной ситуации вы можете использовать memcpy. Простой способ может быть таким в вашем коде вместо цикла for:

memcpy(str2, str1, str2len);

Но ваш код серьезно испорчен. Я не знаю, как вы реализовали str_len, но нет абсолютно никакого способа (если вы не используете нестандартные, непереносимые, грязные хаки), чтобы получить размер блока, на который указывает указатель.

...