Обнаружено разрушение стека - прервано после обновления структуры в функции указателем - PullRequest
0 голосов
/ 17 июня 2019

во время выполнения кода, я получил "обнаружение разрушения стека" - прервано после того, как указатель вернулся из функции (которая работает правильно - это распределить структуру и инициировать ее)

// global putside the main:

typedef struct {int id; int flight; int chairs;}request,*Prequest;

//calling from main look like:

Prequest p1 = (Prequest)convert_from_buffer_to_struct(buffer);

//the function :

Prequest convert_from_buffer_to_struct(char buffer[]) {

    printf("\nbuffer is:%s",buffer);
    char sid[ID_LONG],sflight[FLIGHT_LONG],schairs[CHAIRS_LONG];
    int id, chairs, flight;
    Prequest p = (Prequest) malloc(sizeof(request));

    if(p == NULL){ printf("\n in converting :struct allocation faild\n");exit(-1);}

    strcpy(sid,&buffer[0]);
    id= atoi(sid); 
    p->id= id;

    strcpy(sflight,&buffer[ ID_LONG + SPACE_LONG ]);
    flight= atoi(sflight);
    p->flight=flight;

    strcpy(schairs,&buffer[ID_LONG + SPACE_LONG + FLIGHT_LONG +SPACE_LONG]);
    chairs= atoi(schairs);  
    p->chairs=chairs;
    return p;
}

Я проверял функцию много разпомещая printf после каждой строки, чтобы показать каждый результат, это работает очень, но ошибка, которую я получаю после того, как указатель возвращается к главному.Так что же вы ожидаете, что два указателя:
p (возвращенный из функции) и p1 (определенный в главном), почему они привели к разрушению стека?!

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

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

0 голосов
/ 17 июня 2019

Предполагая, что buffer - это массив большего размера, в котором хранятся id, рейс и стулья с одним null окончанием.

Вы получаете доступ вне границы для sid, sflightи schairs.

strcpy будет копировать содержимое до тех пор, пока не достигнет \0, что приведет к выходу за пределы для src аргументов.

replace

strcpy(sid,&buffer[0]);

до

strncpy(sid,&buffer[0], ID_LONG);
sid[ID_LONG - 1] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...