Ошибка структуры C: обнаружено разрушение стека, прерывание (ядро выгружено)

Привет, я пишу простую программу на C с использованием «struct». Я пытаюсь добавить строки (что всегда кажется проблемой), и я наконец могу скомпилировать, но когда я запускаю его, я получаю сообщение об ошибке. Имя файла - «структура», это ошибка:

*** stack smashing detected *** ./struct terminated
Aborted (core dumped)

Вот код:

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


struct members {

    int  id;
    int  age;
    char name[];
};
int main(void)
{
    struct members person;
    person.id = 1223;
    person.age = 37;
    strcpy(person.name, "Matthew");

    printf("ID: %d\n Age: %d\n Name: %s\n", person.id, person.age, person.name);

return 0;
}

Я понятия не имею, почему он компилируется нормально, а затем падает. Я предполагаю, что это проблема памяти с кодом по отношению к строке. Забавно то, что он действительно работает и выводит информацию на консоль, а затем вылетает. Любая помощь приветствуется. Спасибо.


person DGwang    schedule 31.01.2016    source источник
comment
потому что char name[] похоже на выполнение const char *, вы должны просто назначить ему напрямую, например person.name = "Matthew"   -  person Ryan    schedule 01.02.2016
comment
компилируется правильно, не означает, что программа является правильной. Если вам удастся написать инструмент, который может гарантировать это, вы решите проблему остановки и станете лучшим кандидатом на премию Тьюринга.   -  person too honest for this site    schedule 01.02.2016
comment
stackoverflow.com/q/12680946/3185968   -  person EOF    schedule 01.02.2016


Ответы (3)


Попробуй это. Вы не выделяете память для имени.

struct members {

    int  id;
    int  age;
    char * name;
};
...
person.name=strdup("Matthew");
person goCards    schedule 31.01.2016

У вас нет памяти, выделенной для элемента name из struct members. При выполнении strcpy вы будете писать вне памяти стека, где был помещен person, "разбивая" стек.

Вам необходимо выделить память для элемента name, либо статически, объявив его

char name[20];

или лучше, динамически в main() с использованием

persons.name = calloc(1, strlen("Matthew") + 1);
person Aderstedt    schedule 31.01.2016
comment
Это была очень полезная информация. Огромное спасибо. - person DGwang; 03.02.2016

проблема заключается в том, что ни в структуре, ни где-либо еще нет места для хранения символов строки «Мэтью».

относительно этой строки:

char name[];

предлагаю изменить на:

char *name;

затем, поскольку нет выделения для фактических байтов данных, только указатель, чтобы установить его с помощью указателя. I.E.

person.name = strdup( "Mathew" );

Конечно, помните, что перед выходом из main () нужно передать этот указатель на free().

free( person.name );

Во-вторых (НО ИМО: менее желательный метод, поскольку неизвестна необходимая максимальная длина), может изменить определение структуры на:

struct members 
{
int  id;
int  age;
char name[100]; // arbitrary size, but must be large enough to hold max name string, including NUL termination byte
};

тогда текущий код будет работать:

strcpy(person.name, "Matthew");
person user3629249    schedule 01.02.2016
comment
Спасибо за полезный вклад. - person DGwang; 03.02.2016