C语言float数组两种声明方式不等效问题及等效声明方法咨询
两个数组声明不等效的原因
- 长度不匹配:第一种方式通过
malloc分配了256*10 = 2560个float元素的连续内存,你后续循环访问到索引2398属于合法范围。第二种方式的初始化列表只有15个元素,编译器会自动推导数组长度为15,一旦后续代码访问索引>=15的位置,就会触发数组越界,属于C语言的未定义行为,运行结果自然不符合预期。 - 存储特性差异:
malloc分配的内存在堆区,生命周期持续到主动调用free(),不会随函数返回失效。如果第二种数组定义在函数内部,属于栈内存,函数执行结束后内存会自动回收,若后续存在野指针访问也会导致异常。 - 额外注意:你贴的第一种代码存在变量名笔误,定义的指针是
array,循环里操作的是data,实际运行时要保证变量名一致,否则也会引发错误。
等效的数组声明方法
如果要和第一种malloc的行为完全等效,需要保证数组长度为2560,写法分两种场景:
- 允许自动初始化剩余元素为0
直接指定数组长度,初始化前15个元素即可,未显式初始化的元素会被编译器自动置0:
float array[2560] = {120.0, 160.0, 255.0, 216.0, 255.0, 224.0, 0.0, 16.0, 74.0, 70.0, 73.0, 70.0, 0.0, 1.0, 1.0};
- 完全匹配
malloc未初始化剩余元素的行为malloc返回的内存是未初始化的,剩余元素值为随机垃圾值,如果要完全对齐这个行为,先声明数组再手动赋值前15个元素:
float array[2560]; const float init_vals[] = {120.0, 160.0, 255.0, 216.0, 255.0, 224.0, 0.0, 16.0, 74.0, 70.0, 73.0, 70.0, 0.0, 1.0, 1.0}; memcpy(array, init_vals, sizeof(init_vals));
注:2560个float总大小约10KB,绝大多数平台的默认栈空间都能容纳,如果数组更大建议继续使用malloc避免栈溢出。
内容的提问来源于stack exchange,提问作者lena
相关产品推荐
相关产品推荐

