C char* printf 问题

标签 c arguments undefined-behavior function-declaration

我遇到了 char* 变量的奇怪行为

user_message* parseMessage(char *incoming_msg, uint64_t size)
{
    user_message* msg = calloc(1, sizeof(user_message));
    printf("value: %s\n", incoming_msg);
    return msg;
}
void start_server()
{
    char* msg = "1|david|pwd|";
    printf("msg: %s\n", msg);
    parseMessage(&msg, 12);
}

输出:

msg: 1|david|pwd|
value: �[

我很难找出代码中的问题。

最佳答案

函数parseMessage的第一个参数和用作该参数参数的表达式具有不同的类型。

参数被声明为类型 char *

user_message* parseMessage(char *incoming_msg, uint64_t size)

而用作参数的表达式的类型为 char **

char* msg = "1|david|pwd|";
//...
parseMessage(&msg, 12);

因此,实际上,您不是输出指针 msg 指向的字符串,而是尝试将变量 msg 占用的内存中存储的内容及其后面的内容作为字符串输出

您至少需要调用该函数

parseMessage( msg, 12 );

此外,如果函数内传递的字符串未更改,则最好至少使用限定符 const 声明第一个函数参数

user_message* parseMessage( const char *incoming_msg, uint64_t size);

关于C char* printf 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70427365/

相关文章:

c++ - 正如 Clang 似乎表明的那样,这段代码真的是未定义的吗?

c - POSIX fopen(NULL ,"r")

c - gcc -W -Wall -O -pedantic -std=c99 与具有相同选项的 clang

Python 类可以带参数吗?

java - 是否可以在方法调用时使用值初始化 `List`

c++ - 未定义的行为和顺序点

c - 如何生成霍夫曼树的二进制代码表?

c - 如何计算模除法

kubernetes - kubectl运行--command vs —参数

c++ - 类中声明的枚举的默认值