技术问询:能否向const double数组输入数据?
能否向const double数组输入数据?
Hey,这个问题戳中了C语言里const修饰符的核心语义——你绝对不能直接向const double数组输入数据,咱们把这个事儿掰扯明白:
- 首先,
const修饰数组的本质是告诉编译器:这块内存里的内容是只读的,程序不应该对它进行修改操作。如果你尝试用scanf这类输入函数直接往const double数组里写数据,编译器会直接抛出错误,根本不让你通过编译,比如这段代码:
#include <stdio.h> int main() { const double arr[3]; // 编译器会直接报错:assignment of read-only location 'arr[0]' scanf("%lf", &arr[0]); return 0; }
编译器一眼就看出你要修改只读内存,直接把代码拦下来了。
- 那有没有“歪门邪道”能绕过去?比如用指针强制转换?比如:
const double arr[3]; double *ptr = (double *)arr; scanf("%lf", ptr);
别这么干!这属于C标准里明确规定的未定义行为——它可能在某些环境下看起来“正常运行”,但随时可能崩溃,或者被编译器优化后出现莫名其妙的bug,完全没有可靠性可言,绝对不推荐。
- 如果你的需求是先输入数据,之后再以只读方式使用,正确的做法是:先把数据输入到非const的数组里,再用
const指针或者数组来只读访问它,比如:
#include <stdio.h> int main() { double temp_arr[3]; // 先把数据输入到可修改的临时数组 for (int i = 0; i < 3; i++) { scanf("%lf", &temp_arr[i]); } // 用const指针来只读访问这些数据 const double *arr = temp_arr; // 只能读,不能写 printf("第一个元素:%.2lf\n", arr[0]); return 0; }
总结一下:任何直接修改const数组的操作都是不符合C语言语义的,要么被编译器阻止,要么触发不可控的未定义行为。如果需要输入数据,一开始就别给数组加const修饰,或者用临时数组过渡。
内容的提问来源于stack exchange,提问作者kelvinchiyin
相关产品推荐
相关产品推荐

