为什么这个指针传递不起作用?

时间:2010-08-24 00:21:58

标签: c

编辑:初始“浮动**浮动;”是一个错字,纠正。另外,“* floats [0] = 1.0;”确实有效,但“*浮动[1] = 1.0;”那时是segfauls。该数组是malloced。对于迂腐的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;
}

分配时的段错误;

3 个答案:

答案 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);

会发生什么?首先,floatsfloat *,由于未分配,因此它指向随机内存位置,例如0xBADD。如果你写到这里,你可能会搞砸了。

floats的地址,&floats是另一个指向堆栈位置的内存位置,比如说0x1000。这将传递给func,然后逐字传递给func2

func2做什么?它试图在位置*floats[1]中写一些东西。我不确定先发生什么,支架或星星,所以让我们考虑两种情况:

*(floats[1]):首先你会发现floats[1]是什么。由于floats是初始floats变量的内存位置,因此0x1000floats[1]0x1004将为0x1004,因为假设32位系统,指针的宽度为4个字节。然后你尝试取消引用这个指针,这是内存位置0xBAD2中任何内容的值。这可能是任何事情,比如(*floats)[1],所以尝试写一个浮点值很可能会导致段错误。

floats。在这里,您首先取消引用0xBADD,其中float *0xBADD + 4,类型为0xBAE1。然后,您尝试将值写入{{1}}或{{1}}。这是没有为您分配的内存,因此在那里写文件可能会导致段错误。

无论哪种方式,你都在弄乱不属于你的内存,从而导致段错误。