以下代码片段产生相同的输出.但哪个是对的?

Sri*_*kar -1 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";

}
Run Code Online (Sandbox Code Playgroud)

现在正确的代码片段

#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";

}
Run Code Online (Sandbox Code Playgroud)

上面代码的目的是修改str的值. 这两个代码产生相同的输出,但为什么在这种情况下错误的代码似乎正常工作.

use*_*751 5

第一个不应该编译,因为&str是a char**,但函数声明为a char*.

另外,在*msg = "World";,"World"是一个char*但是*msg是单一的char.