簡體   English   中英

使用strcpy引發“檢測到堆棧粉碎”錯誤

[英]Using strcpy throws “stack smashing detected” error

我有兩種類型的structstruct msgstruct 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 pktchar[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM