Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 下面的代码段产生相同的输出。但哪一个是对的?_C_Pointers_Pass By Reference - Fatal编程技术网

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这段代码实际上是一个约束冲突(事实上有两个),编译器必须发出诊断消息(并且生成的任何可执行文件都是无意义的)