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

The below code snippets produce the same output. But which is right?

下面的代码片段是错误的......但似乎工作正常

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

}

现在是正确的代码片段

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

}

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

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

此外,在 *msg = "World"; 中,"World" 是一个 char*,但 *msg 是一个 char