C语言将指针作为函数参数使用,printf输出字符串为null如何解决?
问题原因
你的代码有两处核心的类型不匹配错误,均属于C语言的未定义行为,你观测到的(null)只是未定义行为的其中一种表现:
- 第一处错误在
printf的字符串参数部分:%s格式符要求传入的参数是指向字符串首地址的char*类型指针,但你写的*string是对string指针做解引用操作,拿到的是字符串第一个字符'H'的ASCII值(数值为0x48)。printf会把这个传入的字符值当成内存地址去读取字符串,这个地址本身不属于合法的字符串内存区间,你观测到输出(null)只是平台处理非法地址的凑巧表现,多数情况下这个错误会直接导致程序崩溃。 - 第二处错误在
printf的数字参数部分:%d格式符仅适用于int类型,你传入的number是int64_t类型,类型不匹配。如果当前环境中int是32位长度,该写法同样会触发未定义行为,你现在能正常输出42只是小端存储模式下高位补0的凑巧结果。
另外你代码开头的(void)number;和(void)string;是用来消除「变量未使用」编译警告的写法,你后续已经使用了这两个变量,这两行可以直接删除。
修正后的代码
#include <stdio.h> #include <inttypes.h> // 包含PRId64宏的头文件 void print_line(int64_t number, char *string) { // 用PRId64匹配int64_t类型,直接传string指针给%s printf("%" PRId64 " %s \n", number, string); return; } int main() { print_line(42, "Hello World!"); return 0; }
运行后即可输出预期结果:42 Hello World!
内容的提问来源于stack exchange,提问作者tcx
相关产品推荐
相关产品推荐

