我有以下代碼:
#include <stdio.h>/span>
typedef struct {
int a, b, c, d, e, f;
}
type1;
typedef struct {
int a, b, c;
}
type2;
type1 RTE = {
1,
2,
3,
4,
5,
6, 6.
};
void copy(type1 * arg) {
* arg = RTE;
}
//在此寫下C語言代碼。
printf("%d
", RTE.c)。)
type2本地。
copy((type1 * ) &local)。
printf("%d", local.c) 。
return 0。
}
當我運行它時,我得到一個堆疊粉碎檢測錯誤。我懷疑這是因為鑄造的緣故,但我無法弄清原因。如果有人能給我解釋一下,我將非常感激。
uj5u.com熱心網友回復:
結構type1需要的記憶體空間是type2的兩倍,但是你在陳述句type2 local;中只分配了一個type2的變數。 這將被分配到堆疊中,因為它是一個區域變數。 當指標在陳述句copy((type1 * ) &local);中被投出,然后在函式copy內的陳述句* arg = RTE;中被取消參考,程式將把RTE中較大的內容復制到local中較小的分配的記憶體中,基本上是溢位了。 如果堆疊從底部向上填充,這基本上會破壞堆疊,導致程式回傳時失敗。
作為一個普遍的做法,在兩種不同型別的指標之間進行轉換并不是一個好主意。 另外,對于ANSI C,編譯器可以決定如何安排struct成員相對于struct的基址,所以假設struct的任何特定成員將被轉移到任何其他特定成員,無論型別和定義順序如何,這都是不安全的。
如果你想把一個type1物件的內容復制到一個type2物件中,應該逐個成員進行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/322487.html
標籤:
上一篇:在C語言中使用運算子從無符號int中抓取6個最重要的位的最佳方法?
下一篇:我試圖用ASP.Netcore向內部服務器上的一個API發出一個帖子請求。我收到了內部服務器的錯誤,盡管它在postman中是有效的。
