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

时间:2019-06-17 14:28:42

标签: c linux pointers struct

在运行代码期间,我得到了“检测到堆栈粉碎”-在函数返回指针后中止(该方法正确无误-它正在分配构造函数并初始化它)

// 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(从函数返回),  和 p1(在主体中定义), 为什么导致堆栈粉碎?!

2 个答案:

答案 0 :(得分:0)

假设buffer是一个更大的数组,其中包含id,flight和chair,最后只有一个null终止。

您正在访问sidsflightschairs的边界。

strcpy将复制内容直到到达\0,从而对src自变量进行无界访问。

替换

strcpy(sid,&buffer[0]);

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

答案 1 :(得分:0)

我已经找到了原因,它是调用此函数的线程,它被定义为指向线程的指针,我对其进行了修复,它可以正常工作。 thnx