C / C ++

时间:2015-07-08 20:46:26

标签: c pointers static-memory-allocation

使用

之间有什么区别
float* f;

float f[4];

或者他们对待的方式完全相同?使用一个可能会导致您遇到内存分配问题吗?如果没有,是否有任何情况下他们被区别对待?

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

void myfun(float* f){
     f[0] = 0;
     f[1] = 1;
     f[2] = 2;
     f[3] = 3;
}
编译并运行良好的

(我不确定为什么 - 我会认为,因为我没有为f分配任何内存,它会引发某种异常)。

3 个答案:

答案 0 :(得分:3)

float* f;

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

myfun

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

未分配的指针通常指向随机内存,因此如果将其传递到sizeof(f)函数,则会得到未定义的行为。有时它似乎可以工作(覆盖它所指向的任何随机存储器),有时除了(试图写入无效或无法访问的内存)

在许多情况下,他们的待遇相同,而在其他情况下则不然。即@Test public void testMapPrint() { Map<String, String> map = new HashMap<>(); map.put("a", "b"); map.put("c", "d"); map.entrySet().stream() .forEach(entry -> System.out.println(entry.getKey() + ":" + entry.getValue())); } 会有所不同。

答案 1 :(得分:1)

float* f;

它是一个指向名为f的float

类型变量的指针
float f[4];

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

使用

之间有什么区别

float * f;

float f [4];

  

或者他们对待的方式完全一样吗?

没有

  

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

你不应该使用一个代替其他人,你可能面临多个问题而不仅仅是与记忆相关的问题。

  

如果没有,是否存在不同对待方式?

除了可以作为函数形式参数互换的场景数组和指针声明外,它们总是区别对待。

  

编译并运行良好(我不确定为什么 - 我会想   因为我没有为f分配任何内存,所以它会抛出一些内存   一种例外)。

以上解释了此场景作为上一个答案中的例外情况。

阅读arrays and pointers

答案 2 :(得分:1)

  

“我会认为,因为我没有为f分配任何内存会导致某种异常。”

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

你的冰箱可能会吃掉你的猫......