char * diff in c & c++

本文探讨了在GCC和G++编译器下,相同代码中指针p指向字符串字面量时的行为差异。作者发现这段代码在GCC下可以编译通过,但在G++下编译失败。文章提出疑问:为何GCC能接受这种看起来修改常量的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

same code as below

char *p;
p = "123";
p = "234";


on my machine , it can be compiled with gcc, but failed with g++;

I don't know why it works in gcc.. why the *p can change its value;


刚刚提供的代码运行时出现了这样的问题应如何解决In file included from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/BlinkerESPMQTT.h:16, from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker.h:43, from C:\Users\98243\AppData\Local\Temp\.arduinoIDE-unsaved202559-18148-1nac5os.ts0gl\sketch_jun9a\sketch_jun9a.ino:5: c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Adapters/BlinkerMQTT.h: In member function 'virtual char* BlinkerMQTT::token()': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Adapters/BlinkerMQTT.h:144:50: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 144 | char * token() { if (!isMQTTinit) return ""; else return MQTT_KEY_MQTT; } | ^~ In file included from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/BlinkerESPMQTT.h:16, from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker.h:43, from C:\Users\98243\AppData\Local\Temp\.arduinoIDE-unsaved202559-18148-1nac5os.ts0gl\sketch_jun9a\sketch_jun9a.ino:5: c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Adapters/BlinkerMQTT.h: In member function 'virtual char* BlinkerMQTT::lastRead()': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Adapters/BlinkerMQTT.h:963:17: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 963 | else return ""; | ^~ In file included from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:95, from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/BlinkerESPMQTT.h:17, from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker.h:43, from C:\Users\98243\AppData\Local\Temp\.arduinoIDE-unsaved202559-18148-1nac5os.ts0gl\sketch_jun9a\sketch_jun9a.ino:5: c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApiBase.h: In member function 'char* BlinkerBridge_key::getName()': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApiBase.h:196:29: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 196 | else return "false"; | ^~~~~~~ In file included from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:96, from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/BlinkerESPMQTT.h:17, from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker.h:43, from C:\Users\98243\AppData\Local\Temp\.arduinoIDE-unsaved202559-18148-1nac5os.ts0gl\sketch_jun9a\sketch_jun9a.ino:5: c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h: In member function 'char* BlinkerProtocol::deviceName()': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h:104:86: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 104 | char * deviceName() { if (isInit) return conn->deviceName(); else return ""; } | ^~ c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h: In member function 'char* BlinkerProtocol::authKey()': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h:105:83: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 105 | char * authKey() { if (isInit) return conn->authKey(); else return ""; } | ^~ c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h: In member function 'char* BlinkerProtocol::token()': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h:106:79: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 106 | char * token() { if (isInit) return conn->token(); else return ""; } | ^~ c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h: In member function 'char* BlinkerProtocol::dataParse()': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h:257:86: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 257 | char* dataParse() { if (canParse) return conn->lastRead(); else return ""; } | ^~ In file included from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Adapters/BlinkerMQTT.h:46, from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/BlinkerESPMQTT.h:16, from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker.h:43, from C:\Users\98243\AppData\Local\Temp\.arduinoIDE-unsaved202559-18148-1nac5os.ts0gl\sketch_jun9a\sketch_jun9a.ino:5: c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: At global scope: c:\users\98243\documents\arduino\libraries\blinker\src\blinker\blinkerconfig.h:226:41: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 226 | #define BLINKER_CMD_BUILTIN_SWITCH "switch" | ^~~~~~~~ c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:913:71: note: in expansion of macro 'BLINKER_CMD_BUILTIN_SWITCH' 913 | BlinkerWidgets_string _BUILTIN_SWITCH = BlinkerWidgets_string(BLINKER_CMD_BUILTIN_SWITCH); | ^~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/BlinkerESPMQTT.h:17, from c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker.h:43, from C:\Users\98243\AppData\Local\Temp\.arduinoIDE-unsaved202559-18148-1nac5os.ts0gl\sketch_jun9a\sketch_jun9a.ino:5: c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::bridgeKey(uint8_t)': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:7831:21: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 7831 | else return ""; | ^~ c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::bridgeName(uint8_t)': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:7838:21: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 7838 | else return "false"; | ^~~~~~~ c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::widgetName_str(uint8_t)': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:8467:17: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 8467 | else return ""; | ^~ c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::widgetName_joy(uint8_t)': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:8474:21: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 8474 | else return ""; | ^~ c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::widgetName_rgb(uint8_t)': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:8481:17: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 8481 | else return ""; | ^~ c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::widgetName_int(uint8_t)': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:8487:17: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 8487 | else return ""; | ^~ c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::widgetName_tab(uint8_t)': c:\Users\98243\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:8493:17: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 8493 | else return ""; | ^~ . Variables and constants in RAM (global, static), used 36556 / 80192 bytes (45%) ║ SEGMENT BYTES DESCRIPTION ╠══ DATA 1676 initialized variables ╠══ RODATA 4360 constants ╚══ BSS 30520 zeroed variables . Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 62251 / 65536 bytes (94%) ║ SEGMENT BYTES DESCRIPTION ╠══ ICACHE 32768 reserved space for flash instruction cache ╚══ IRAM 29483 code in IRAM . Code in flash (default, ICACHE_FLASH_ATTR), used 512816 / 1048576 bytes (48%) ║ SEGMENT BYTES DESCRIPTION ╚══ IROM 512816 code in flash
最新发布
06-10
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值