运行代码,我得到“检测到堆栈粉碎” - 从函数返回指针后中止(它工作正常 - 它分配结构体并启动它)。
// 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),
为什么它们会导致堆栈崩溃?
假设
buffer
是一个更大的数组,其中包含 id、航班和椅子,最后只有一个 null
终止。
您正在进入
sid
、sflight
和 schairs
的界限。
strcpy
将复制内容,直到到达 \0
,从而访问 src
参数的界限。
更换
strcpy(sid,&buffer[0]);
到
strncpy(sid,&buffer[0], ID_LONG);
sid[ID_LONG - 1] = '\0';
我找到了原因,是线程调用了这个函数,它被定义为指向线程引用的指针,我修复了它,它可以工作。谢谢