【问题标题】:The below code snippets produce the same output. But which is right?下面的代码片段产生相同的输出。但哪个是正确的?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多