-4

使用和使用有什么区别

float* f;

float f[4];

还是他们的待遇完全相同?使用其中一个可能会导致您遇到内存分配问题吗?如果不是,是否有任何情况可以区别对待?

不知道这是否相关,但我使用类型 float* 作为函数参数。例如:

void myfun(float* f){
     f[0] = 0;
     f[1] = 1;
     f[2] = 2;
     f[3] = 3;
}

它编译并运行良好(我不太确定为什么 - 我认为因为我没有分配任何内存f,它会引发某种异常)。

4

3 回答 3

5
float f[4]

是一个分配有自动存储(通常是堆栈)的数组

float* f;

是一个指针,它本身除了指针的大小之外没有任何分配。它可以指向单个浮点值,也可以指向使用自动或动态存储(堆)分配的浮点数组

未分配的指针通常指向随机内存,因此如果将其传递给myfun函数,您将获得未定义的行为。有时它似乎可以工作(覆盖它指向的任何随机内存),有时它会除外(尝试写入无效或不可访问的内存)

他们在许多情况下都受到相同的对待,而在其他情况下则不然。即sizeof(f)会有所不同。

于 2015-07-08T20:52:22.580 回答
1
float* f;

它是一个指向浮点类型 f 的变量的指针

float f[4];

它是一个名为 f 的数组变量,类型为 float,大小为 4

使用和使用有什么区别

浮动* f;

浮动 f[4];

还是他们的待遇完全相同?

使用其中一个可能会导致您遇到内存分配问题吗?

您不应该使用一个代替另一个,您可能会面临多个问题,而不仅仅是与内存相关的问题。

如果不是,是否有任何情况可以区别对待?

除了可作为函数形式参数互换的场景数组和指针声明外,它们总是以不同的方式处理。

它编译并运行良好(我不太确定为什么 - 我认为因为我没有为 f 分配任何内存,所以它会抛出某种异常)。

上面将这种情况解释为先前答案中的一个例外。

读取数组和指针

于 2015-07-08T20:48:14.643 回答
1

“我认为因为我没有为 f 分配任何内存,所以它会引发某种异常)。”

不,如果您没有f适当地分配内存,则取消引用只是未定义的行为。没有例外保证。

你的冰箱可能会吃掉你的猫,以防万一......

于 2015-07-08T20:49:31.820 回答