这有效:
(伪:)
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;
}
分配时的段错误;
答案 0 :(得分:3)
因为'浮动'是一个糟糕的指针。当然,你声明了指针,但是你还没有分配任何内存,所以只要它发生在哪里,就会无效。
此外,float **的地址是float ***,这不是你的函数所要求的。
答案 1 :(得分:1)
为什么要将指针传递给数组?你试过吗
func(float *floats)
{
func2(floats);
}
func2(float *floats)
{
floats[0] = 2;
}
答案 2 :(得分:0)
假设您有这两个功能,就像您发布的那样:
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
将为0x1004
,因为假设32位系统,指针的宽度为4个字节。然后你尝试取消引用这个指针,这是内存位置0xBAD2
中任何内容的值。这可能是任何事情,比如(*floats)[1]
,所以尝试写一个浮点值很可能会导致段错误。
floats
。在这里,您首先取消引用0xBADD
,其中float *
为0xBADD + 4
,类型为0xBAE1
。然后,您尝试将值写入{{1}}或{{1}}。这是没有为您分配的内存,因此在那里写文件可能会导致段错误。
无论哪种方式,你都在弄乱不属于你的内存,从而导致段错误。