在运行代码期间,我得到了“检测到堆栈粉碎”-在函数返回指针后中止(该方法正确无误-它正在分配构造函数并初始化它)
// 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(在主体中定义),
为什么导致堆栈粉碎?!
答案 0 :(得分:0)
假设buffer
是一个更大的数组,其中包含id,flight和chair,最后只有一个null
终止。
您正在访问sid
,sflight
和schairs
的边界。
strcpy
将复制内容直到到达\0
,从而对src
自变量进行无界访问。
替换
strcpy(sid,&buffer[0]);
到
strncpy(sid,&buffer[0], ID_LONG);
sid[ID_LONG - 1] = '\0';
答案 1 :(得分:0)
我已经找到了原因,它是调用此函数的线程,它被定义为指向线程的指针,我对其进行了修复,它可以正常工作。 thnx