C программа выдаёт странный вывод - PullRequest
3 голосов
/ 29 января 2020

В процессе обучения C я решил создать struct , которая дает мне размер Fi sh, который я предоставляю, поэтому возникает вопрос, почему, когда я напишите этот маленький кусочек кода:

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

struct fish
    {
        char catfish[9]; //reserve memory for 9 chars
        char goldfish[10]; //reserve memory for 10 chars
        char mackrel;
        char oldfish;
    };

int main()
{
    struct fish typeof_fish;

    strcpy(typeof_fish.catfish, "Big Fish\n");
    strcpy(typeof_fish.goldfish, "Small Fish\n");
    printf("%s\n", typeof_fish.catfish);

    return 0;


}

на выходе выдается "Big Fi sh Small Fi sh" Здесь выводится

еще когда я переписываю верхняя часть кода и изменение символа сом [9] ; to char сом [10] :

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

struct fish
    {
        char catfish[10]; //reserve memory for 10 chars
        char goldfish[10]; //reserve memory for 10 chars
        char mackrel;
        char oldfish;
    };

int main()
{
    struct fish typeof_fish;

    strcpy(typeof_fish.catfish, "Big Fish\n");
    strcpy(typeof_fish.goldfish, "Small Fish\n");
    printf("%s\n", typeof_fish.catfish);

    return 0;


}

выдает здесь "Big Fi sh"

заранее благодарю за ответ на эту загадочную ошибку

Ответы [ 2 ]

8 голосов
/ 29 января 2020

Вы не оставляете достаточно места для нулевого терминатора в catfish[9], когда вы вводите "Big Fish\n". Эта строка имеет длину 9 символов, что означает, что вам нужен буфер размера 10 для хранения нулевого терминатора.

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

1 голос
/ 29 января 2020

Когда вы выполняете первую копию, strcpy() копирует всего 10 байтов (9 из самой строки плюс терминатор). Поскольку в catfish вы выделили только 9 байтов, терминатор переходит к первому байту goldfish, который затем перезаписывается при копировании второй строки. Следовательно, когда вы делаете printf() из catfish, оно не останавливается в конце catfish, а продолжает печатать, пока не найдет терминатор в конце goldfish.

В Во втором случае вы добавляете достаточно места, чтобы терминатор не перезаписывался, поэтому при печати он просто печатает содержимое catfish, как и ожидалось.

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