Проблема с компилятором GCC - PullRequest
0 голосов
/ 18 января 2019

Я использую Arch Linux, и когда я компилирую и запускаю следующий код C,

#include <stdio.h>
#include<string.h>

int main(void) {
    char s1[]="Hello";
    char s2[]="World";

    strcat(s1,s2);
    int s2_len=strlen(s2);

    printf("s1 = %s, s2 = %s and length of s2 = %d.\n", s1, s2, s2_len);

    return 0;
}

Я получаю вывод:

s1 = HelloWorld, s2 = orld and length of s2 = 4.

Хотя вывод должен быть s1 = HelloWorld, s2 = World and length of s2 = 5., и это вывод, когда я использую какую-то онлайн-среду разработки.

Может кто-нибудь объяснить мне, почему это происходит?

1 Ответ

0 голосов
/ 18 января 2019
char s1[]="Hello";
char s2[]="World";

strcat(s1,s2);

Объявления переменных выделяют память для 5 символов каждый плюс завершающий байт NUL. Ваш strcat вызов записывает после этого пробела, что приводит к неопределенным результатам.

В этом случае схема памяти, вероятно, выглядит примерно так

0 1 2 3 4  5 6 7 8 9 10 11
H e l l o \0 W o r l  d \0
^            ^
s1           s2

После strcat результат будет:

0 1 2 3 4 5 6 7 8 9 10 11
H e l l o W o r l d \0 \0
^           ^
s1          s2

Что дает результат, который вы видите. Обратите внимание, что могут быть и другие возможные результаты, программа может, например, сбой при strcat звонке.

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