Программа C выдает странные результаты

Программа C выдает странные результаты

29.01.2020 12:16:37 Просмотров 27 Источник

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

#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;


}

на выходе получается "большая рыба мелкая рыба" Вывод здесь

тем не менее, когда я переписываю верхнюю часть кода и меняю char catfish[9]; на char catfish[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;


}

он производит здесь продукцию" большой рыбы".

заранее благодарю вас за ответ на этот загадочный баг

У вопроса есть решение - Посмотреть?

Ответы - Программа C выдает странные результаты / C program produces weird output

Является ответом!
Michael Bianconi

29.01.2020 12:19:26

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

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

https://stackoverflow.com/questions/59957157/c-program-produces-weird-output/59957195#comment106035516_59957195
Спасибо за объяснение
ad3angel1s

29.01.2020 01:37:13

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

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

https://stackoverflow.com/questions/59957157/c-program-produces-weird-output/59958142#comment106035520_59958142
Спасибо за подробное объяснение
Закрыть X