我有兩種類型的struct
s,struct msg
和struct pkt
。 我的工作是使用struct msg
構建一個struct pkt
作爲參數傳遞。使用strcpy拋出「stack smashing detected」錯誤
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?
'strcpy'需要空終止字符串也許你沒有傳遞什麼,它預計 – juanchopanza 2014-10-17 10:22:20
它是由一個模擬器運行和字符串傳遞。從功能n的長度爲20(+1表示空值)。我不知道爲什麼他們將字符串定義爲大小爲20的char數組(我不允許更改),如果他們要傳遞大小爲21的char數組。 – user2418202 2014-10-17 10:25:36
是的......你不能在20個數組中保存21個元素。 – juanchopanza 2014-10-17 10:26:21