我有两种struct
s,struct msg
和struct pkt
。
我的工作是使用struct pkt
作为参数构建struct msg
。
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
类型的内存复制到char[20]
中struct pkt
字段的内存中,为什么第三个参数应为sizeof(struct msg)
,而不是strlen(message.data)+ 1?
答案 0 :(得分:4)
strcpy(snd_pkt.payload, message.data);
只有当您的char数组数据为空终止时,才能正常运行。
或者,您可以使用:
size_t ss = sizeof(snd_pkt.payload);
strncpy(snd_pkt.payload, message.data, ss-1);
snd_pkt.payload[ss-1] = '\0';
答案 1 :(得分:4)
我不明白的是,如果我将char [20]复制到char [20],并且 使用strcpy,不应该没问题吗?
如果结构msg的数据成员数据零终止(如果它包含字符串),那将没有问题。似乎错误的原因是它不包含字符串。 至于这个陈述
memcpy(&snd_pkt.payload, &message, sizeof(struct msg));
然后在一般情况下它具有未定义的行为,因为由于结构对齐,结构的大小可以大于20个字节,例如当sizeof(int等于8。
答案 2 :(得分:0)
使用简单的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];
}
...