[英]Using strcpy throws “stack smashing detected” error
我有两种类型的struct
, struct msg
和struct pkt
。 我的工作是使用作为参数传递的struct msg
构造一个struct pkt
。
struct msg {
char data[20];
};
struct pkt {
int seqnum;
int acknum;
int checksum;
char payload[20];
};
而
void A_output(struct msg message) { //fails
...
struct pkt snd_pkt;
strcpy(snd_pkt.payload, message.data);
...
}
失败,
void A_output(struct msg message) { //succeeds
...
struct pkt snd_pkt;
memcpy(&snd_pkt.payload, &message, sizeof(struct msg));
...
}
成功。
我不明白的是,如果我将char [20]复制到char [20]并使用strcpy
,那还好吗? 为什么会抛出堆栈粉碎错误?
在工作答案中,为什么将struct msg
类型的内存复制到struct pkt
中char[20]
字段的内存中,为什么第三个参数应该是sizeof(struct msg)
而不是strlen(message.data)+ 1 ?
strcpy(snd_pkt.payload, message.data);
仅当您的char数组数据以null终止时,才应该没问题。 或者,您可以使用:
size_t ss = sizeof(snd_pkt.payload);
strncpy(snd_pkt.payload, message.data, ss-1);
snd_pkt.payload[ss-1] = '\0';
我不明白的是,如果我将char [20]复制到char [20],并使用strcpy,那还好吗?
如果结构msg的数据成员数据以零结尾(即它包含字符串)会很好。 似乎错误的另一个原因是它不包含字符串。 至于这个说法
memcpy(&snd_pkt.payload, &message, sizeof(struct msg));
那么通常情况下它具有不确定的行为,因为由于结构对齐,例如sizeof(int等于8时,结构的大小可以大于20个字节。
使用简单的for循环也可以很好地完成工作:
void A_output(struct msg message) {
...
struct pkt snd_pkt;
int i=0,
for(i=0;i<20;i++){
snd_pkt.payload[i] = msg.data[i];
}
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.