使用strcpy throws"堆栈粉碎检测"错误

时间:2014-10-17 10:19:31

标签: c++ c

我有两种struct s,struct msgstruct 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?

3 个答案:

答案 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];
}
...