【问题标题】:How do i use pointer as parameter如何使用指针作为参数
【发布时间】:2021-12-11 06:07:09
【问题描述】:

我写了一些东西来熟悉指针。

    void print_line(int64_t number, char *string)
{
    (void)number;
    (void)string;

    printf("%d %s \n", number, *string);
    return;
}

int main()
{
    print_line(42, "Hello World!");
    return 0;
}

我希望结果是 42 和“Hello World!”。但是它是 42(空)。 我假设我以错误的方式使用了指针。 我的错误在哪里?为什么地址是空的?

非常感谢!

【问题讨论】:

  • 如果要打印整个字符串,为什么要取消引用指针?这不是您在使用 %s 说明符时应该传递给 printf 的内容
  • 第 3 行和第 4 行是什么?我最近似乎经常看到这种情况。
  • @Dúthomhas 垃圾。他们应该被删除。在其他情况下,它可以用来避免“未使用”的警告。
  • 我知道这毫无意义。如果您有未使用的参数,请不要指定名称,只需指定类型。这真的是当今人们正在做的事情吗? (因为这很奇怪,恕我直言。)
  • 如果您使用 gcc,请使用 -Wall -Wextra -Wpedantic -Werror

标签: c printf c-strings uint64 conversion-specifier


【解决方案1】:

第一个参数的类型为int64_t

void print_line(int64_t number, char *string)

另一方面,转换说明符%d 用于输出int 类型的数字。所以由于这个原因这个电话

printf("%d %s \n", number, *string);

已经不正确并调用未定义的行为,因为错误的转换说明符与 int64_t 类型的对象一起使用。

如果您的函数的第一个参数的类型为intunsigned int,则您可以在调用printf 时使用转换说明符%d,而在最后一种情况下,如果类型为unsigned int可以用 int 类型表示。

此外,当您传递具有 char 类型的表达式 *string 时,转换说明符 %s 需要一个 char * 类型的指针。

你需要的是包含标题<inttypes.h>

#include <inttypes.h>

并更改printf的呼叫

printf( "%" PRId64 " %s\n", number, string );

这是一个演示程序。

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

void print_line( int64_t number, const char *string )
{
    printf( "%" PRId64 " %s\n", number, string );
}

int main(void) 
{
    print_line( 42, "Hello World!" );
        
    return 0;
}

程序输出是

42 Hello World!

【讨论】:

  • 由于我是 c 的新手,所以我对一切都知之甚少。您的评论很有帮助!
  • @tcx 如果答案有用,您可以选择最佳答案。在这种情况下,你的声望会提高。:)
【解决方案2】:

printf %s 需要一个指向字符串第一个字符的指针。 string 就是这样。

printf("%d %s\n", number, *string);

应该是

printf("%d %s\n", number, string);

确保启用编译器的警告(例如,-Wall -Wextra -pendatic 使用 gcc 和 glang)。

【讨论】:

  • 我还推荐 -pedantic-errors 只是为了让你把事情弄干净(所以,你会得到 -Wall -Wextra -pedantic-errors)。使用 MSVC 时应为 /W4
  • @Dúthomhas 我确实使用-pendatic。我不知道为什么我把它漏掉了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 2011-02-04
相关资源
最近更新 更多