-2

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

    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(空)。我假设我以错误的方式使用了指针。我的错误在哪里?为什么地址是空的?

非常感谢!

4

2 回答 2

1

第一个参数的类型int64_t

void print_line(int64_t number, char *string)

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

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

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

如果函数的第一个参数具有类型,或者在最后一种情况下,如果类型的值可以在 type中表示,则可以%d在调用中使用转换说明符。printfintunsigned intunsigned intint

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

您需要的是包含标题<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!
于 2021-10-25T19:11:41.280 回答
0

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

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

应该

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

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

于 2021-10-25T19:07:45.723 回答