Правильный путь к малокловому пространству для строки, а затем вставлять символы в это пространство? - PullRequest
7 голосов
/ 11 апреля 2011

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

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: Условный переход или перемещение зависит от неинициализированных значений

Ответы [ 3 ]

12 голосов
/ 11 апреля 2011

На самом деле 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);

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

4 голосов
/ 11 апреля 2011

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

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 голосов
/ 11 апреля 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...