ESP8266中char*字符串变量未按预期工作?是否需设为static?
问题解答
这个现象完全正常,核心原因是两种写法的内存属性存在本质差异:
当你写
char* essai = "Hello my world"时,"Hello my world"属于字符串字面量,它会被存储在程序的只读内存区域(ESP8266的代码Flash区是只读的)。虽然用char*可以指向它,但这块内存从设计上就不允许被修改。如果你的test()函数里试图对essai指向的内容做修改操作(比如直接赋值、字符串拼接),就会触发未定义行为——第一次调用可能看似正常,多次调用后内存被非法篡改,就会出现输出异常甚至程序崩溃。而
char essai[50]是在栈(不加static)或者全局/静态存储区(加static)上开辟的可写内存块,大小固定为50字节。用strcpy(essai, "Hello my world")是把字符串字面量的内容复制到这块可写内存里,后续对这块内存的修改操作都是合法的,所以多次调用test()也能正常工作。
额外补充:在C/C++标准中,字符串字面量的实际类型是const char[],用char*指向它是历史遗留的兼容写法,但这绝不代表你有权修改它——ESP8266的硬件特性还会放大这个问题,因为只读Flash的写操作本身就是非法的。
内容的提问来源于stack exchange,提问作者DMike92
相关产品推荐
相关产品推荐

