C 下面的代码段产生相同的输出。但哪一个是对的?
下面的代码片段是错误的……但似乎工作正常C 下面的代码段产生相同的输出。但哪一个是对的?,c,pointers,pass-by-reference,C,Pointers,Pass By Reference,下面的代码片段是错误的……但似乎工作正常 #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"; } #包括 void-fu
#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";
}
#包括
void-fun(char*msg);
int main()
{
char*str=“你好”;
printf(“%s\n”,str);
乐趣;
printf(“%s\n”,str);
返回0;
}
void fun(char*msg){
*msg=“世界”;
}
现在是正确的代码片段
#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";
}
#包括
无效乐趣(字符**msg);
int main()
{
char*str=“你好”;
printf(“%s\n”,str);
乐趣;
printf(“%s\n”,str);
返回0;
}
无效乐趣(字符**msg){
*msg=“世界”;
}
上述代码的目的是修改str的值。
两个代码产生相同的输出,但为什么在这种情况下错误的代码似乎工作正常。第一个代码不应编译,因为
&str
是字符**
,但函数声明为使用字符*
此外,在
*msg=“World”
,“World”
是一个字符*
,但是*msg
是一个单独的字符,当代码调用未定义的行为时,它有时似乎“起作用”。节省时间-启用编译器警告。我不会说“似乎”-未定义意味着未定义,这意味着在特定的编译器或系统上,“未定义”的操作与作者的操作完全相同intended@GovindParmar这段代码实际上是一个约束冲突(事实上有两个),编译器必须发出诊断消息(并且生成的任何可执行文件都是无意义的)