C char* printf 问题

C char* printf issue

我遇到了 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(&msg, 12); 应该是 parseMessage(msg, 12);

&msg 意味着您正在传递一个指向 msg 的指针,当函数只需要一个 char *

时,它将是一个 char **

&msg 产生 char ** 指向字符的指针 .

您的 parseMessage 函数和 printf 说明符 %s 都需要 char *.

这里不需要address-of operator

parseMessage(msg, 12);

函数的第一个参数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);