Вопрос: Правильный способ malloc-пространства для строки, а затем вставить символы в это пространство?


У меня две строки: str1 и str2. Я хочу объединить их в пространстве в куче. Я malloc пространство для них, используя:

char *concat = (char*) malloc(strlen(str1) + strlen(str2) + 1);

Могу я просто сделать:

strcat(concat, str1);
strcat(concat, str2);

И concat даст мне место в куче, когда две струны конкатцируются? Я спрашиваю, потому что кажется, что strcat фактически добавит str1 в конец пространства, выделенного с помощью malloc. Это верно? Итак, str1 появится в позиции strlen (str1) + strlen (str2) + 1.

Причина, по которой я спрашиваю, заключается в том, что я использую метод выше, но я получаю ошибку в valgrind: Условный переход или перемещение зависят от неинициализированного значения (значений)


6


источник


Ответы:


Какие strcat(dest, src) на самом деле это поиск нулевого байта, начиная с dest и далее, а затем напишите src строка там.

После malloc, содержимое памяти не определено, поэтому ваш текущий код может делать любое количество вещей, большинство из которых неверны. Если вы это сделаете concat[0] = 0 перед strcat, тогда ваш код работает, но придется искать длину str1 три раза - один раз за strlen, снова для первого strcat, и последний для второго strcat,

Вместо этого я рекомендую использовать memcpy:

size_t len1 = strlen(str1), len2 = strlen(str2);
char *concat = (char*) malloc(len1 + len2 + 1);

memcpy(concat, str1, len1);
memcpy(concat+len1, str2, len2+1);

Это использует тот факт, что вы знаете с самого начала, где вы хотите, чтобы байты обеих строк проходили, и сколько их есть.


11



Вы хотите сделать strcpy, а затем strcat:

strcpy(concat, str1);
strcat(concat, str2);

strcat полагается на наличие нулевого терминатора ('\ 0'), чтобы знать, с чего начать. Если вы просто malloc и strcat, это будет делать некоторые неприятные вещи.

И нет, ни strcpy, ни strcat не будут делать никакого неявного распределения или перераспределения.


4



Я лично сделал бы следующее:

size_t length = strlen(str1) + strlen(str2) + 1;
char *concat = malloc(sizeof(char) * length);

if(concat == NULL)
{
    // error
}

snprintf(concat, length, "%s%s", str1, str2);

4



Правильный способ malloc-пространства для строки, а затем вставить символы в это пространство? | Programmerz.ru