检测到堆栈粉碎 - 通过指针更新函数中的结构后中止

问题描述 投票:0回答:2

运行代码,我得到“检测到堆栈粉碎” - 从函数返回指针后中止(它工作正常 - 它分配结构体并启动它)。

// 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 来显示每个结果,它非常有效,但是在指针返回到 main 后出现错误。

那么您期望这两个指针的原因是什么:

p (returned from the function),

p1 (defined in main),

为什么它们会导致堆栈崩溃?

c linux pointers struct
2个回答
0
投票

假设

buffer
是一个更大的数组,其中包含 id、航班和椅子,最后只有一个
null
终止。

您正在进入

sid
sflight
schairs
的界限。

strcpy
将复制内容,直到到达
\0
,从而访问
src
参数的界限。

更换

strcpy(sid,&buffer[0]);

strncpy(sid,&buffer[0], ID_LONG);
sid[ID_LONG - 1] = '\0';

0
投票

我找到了原因,是线程调用了这个函数,它被定义为指向线程引用的指针,我修复了它,它可以工作。谢谢

© www.soinside.com 2019 - 2024. All rights reserved.