【发布时间】:2016-08-10 02:01:12
【问题描述】:
下面的代码 sn-p 是错误的......但似乎工作正常
#include <stdio.h>
void fun(char* msg);
int main()
{
char* str = "Hello";
printf("%s\n",str);
fun(&str);
printf("%s\n",str);
return 0;
}
void fun(char* msg){
*msg = "World";
}
现在是正确的代码 sn -p
#include <stdio.h>
void fun(char** msg);
int main()
{
char* str = "Hello";
printf("%s\n",str);
fun(&str);
printf("%s\n",str);
return 0;
}
void fun(char** msg){
*msg = "World";
}
上述代码的目的是修改str的值。 两个代码产生相同的输出,但为什么错误的代码在这种情况下似乎可以正常工作。
【问题讨论】:
-
当代码调用未定义的行为时,有时它似乎“工作”。节省时间 - 启用编译器警告。
-
我不会说“似乎”——未定义意味着未定义,这意味着在特定的编译器或系统上,“未定义”的操作完全符合作者的意图
-
@GovindParmar 这段代码实际上是违反约束(实际上是其中2个),编译器必须发出诊断消息(并且生成的任何可执行文件都是无意义的)
标签: c pointers pass-by-reference