使用
之间有什么区别float* f;
和
float f[4];
或者他们对待的方式完全相同?使用一个可能会导致您遇到内存分配问题吗?如果没有,是否有任何情况下他们被区别对待?
不知道这是否相关,但我使用float *类型作为函数参数。例如:
void myfun(float* f){
f[0] = 0;
f[1] = 1;
f[2] = 2;
f[3] = 3;
}
编译并运行良好的(我不确定为什么 - 我会认为,因为我没有为f
分配任何内存,它会引发某种异常)。
答案 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分配任何内存,所以它会抛出一些内存 一种例外)。
以上解释了此场景作为上一个答案中的例外情况。
答案 2 :(得分:1)
“我会认为,因为我没有为f分配任何内存会导致某种异常。”
不,如果您没有适当地为f
分配内存,则取消引用只是未定义的行为。没有例外保证。
你的冰箱可能会吃掉你的猫......