【问题标题】:C char* printf issueC char * printf 问题
【发布时间】:2022-01-22 09:32:49
【问题描述】:

我正面临 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: �[

我很难弄清楚我的代码有什么问题。

【问题讨论】:

  • 您将char** 传递给一个接受char* 的函数。
  • 如果您没有看到此代码的错误消息,请更改您的编译器设置,以便您看到。尝试运行由错误程序生成的任何二进制文件完全是浪费时间

标签: c arguments undefined-behavior function-declaration


【解决方案1】:

parseMessage(&msg, 12); 应该是parseMessage(msg, 12);

&msg 表示您正在传递一个指向 msg 的指针,当函数只接受一个 char * 时,它将是一个 char **

【讨论】:

  • 你是对的;这是我的错。谢谢你们!
【解决方案2】:

函数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);

【讨论】:

    【解决方案3】:

    &msg 产生 char **,或 pointer-to-pointer-to-char

    您的parseMessage 函数和printf 说明符%s 都期望char *

    这里不需要address-of operator

    parseMessage(msg, 12);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 2011-07-04
      • 2019-04-15
      • 2016-01-09
      相关资源
      最近更新 更多