[英]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.