簡體   English   中英

為什么該指針傳遞不起作用?

[英]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);

怎么了? 首先, floatsfloat * ,並且由於未分配,它指向一個隨機的內存位置,例如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 + 40xBAE1 這是尚未分配給您的內存,因此在該內存中寫可能會導致段錯誤。

無論哪種方式,您都在弄亂不是您自己的內存,從而導致段錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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