[英]Why doesn't this pointer passing work?
編輯:初始“浮動**浮動;” 是一個錯字,更正了。 另外,“ * floats [0] = 1.0;” 確實有效,但是“ * floats [1] = 1.0;” segfauls在這一點上。 數組已分配。 pedantic c99上沒有編譯警告。
這工作:
(偽:)
void func(int*);
int i;
func(&i);
void func(int* i) {
func2(i);
}
void func2(int* i) {
*i = 2;
}
初始值更改為2。
但這不起作用:
void func(float**);
float* floats;
func(&floats);
void func(float** floats) {
func2(floats);
}
void func2(float** floats) {
*floats[1] = 1.0;
}
在任務上出現段錯誤;
因為“浮動”是一個錯誤的指針。 當然,您聲明了指針,但尚未分配任何內存,因此無論指針指向何處都將無效。
另外,float **的地址是float ***,這不是您的函數所需要的。
為什么要傳遞指向數組的指針? 你有沒有嘗試過
func(float *floats)
{
func2(floats);
}
func2(float *floats)
{
floats[0] = 2;
}
假設您有這兩個功能,就像您發布的一樣:
void func2(float** floats) {
*floats[1] = 1.0;
}
void func(float** floats) {
func2(floats);
}
然后,您將具有以下代碼:
float* floats;
func(&floats);
怎么了? 首先, floats
是float *
,並且由於未分配,它指向一個隨機的內存位置,例如0xBADD
。 如果您在此處寫信,則可能會搞砸。
floats
&floats
的地址是另一個內存位置,指向它在堆棧中的位置,例如0x1000
。 這被傳遞給func
,然后逐字傳遞給func2
。
func2
做什么的? 它試圖在*floats[1]
位置寫一些東西。 我不確定首先發生的是括號還是星號,所以讓我們考慮兩種情況:
*(floats[1])
:首先,您知道什么是floats[1]
。 由於floats
是初始floats
變量的存儲位置,因此為0x1000
。 floats[1]
將為0x1004
,因為假設使用32位系統,則指針的寬度為4個字節。 然后嘗試取消引用該指針,該指針是內存位置0x1004
中任何值的值。 可以是0xBAD2
類的任何東西,因此嘗試在其中寫入浮點值很可能會導致段錯誤。
(*floats)[1]
。 在這里,你先提領floats
,這讓你0xBADD
,類型的float *
。 然后,您嘗試將值寫入0xBADD + 4
或0xBAE1
。 這是尚未分配給您的內存,因此在該內存中寫可能會導致段錯誤。
無論哪種方式,您都在弄亂不是您自己的內存,從而導致段錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.