打印由函数返回的指针的值
问题出现的原因:
在函数func_ret()
中,返回的是一个指针变量&c
。然而,在main()
函数中,将返回值赋给了一个整数变量*m
。由于func_ret()
返回的是一个指针,而不是一个整数值,所以打印*m
时会发生错误。
解决方法:
将int *m
声明为一个指针变量,将func_ret()
的返回值赋给m
。然后,使用%p
格式说明符打印m
的地址,而不是打印*m
的值。
下面是修改后的代码:
#include <stdio.h> extern int *func_ret(void); int main(void) { int *m = 0; m = func_ret(); printf("\n m = %p\n", m); //some code return 0; }
这样修改后,即可正确打印m
的地址。
这里的问题是,你正在从 func_ret()
函数返回一个指针,然后试图将返回值捕获到一个 int
变量中,然后尝试使用 %d
打印该值。这很可能会导致未定义行为。
根据 C11 标准的第 §6.3.2.3 章节规定:
任何指针类型都可以转换为整数类型。除非另有规定,否则其结果是实现定义的。如果结果无法用整数类型表示,则行为是未定义的。结果不需要在任何整数类型的值范围内。
解决方法:你需要将 m
的类型从 int
改为 int *
。你还需要使用适当的格式说明符。
另外请注意,main()
的推荐签名是 int main(void)
。
我也在努力想象为什么有人会对这个答案点踩。
我没有点踩,但在大多数情况下,从指针到整数的转换是无害的。最坏的情况是你会打印出一些垃圾值。
先生,我同意您的观点,但在某些情况下,这可能会引起问题,对吧?所以最好使用推荐和定义好的方式。此外,我认为在提问者的情况下,这是一种疏忽。这个转换并非是有意的。:-)
捕获返回值并不会引起未定义行为,因为地址被存储在整数变量中。问题中的代码片段是有效的,其中 m 打印的是变量 C 的地址,但我想要的是 C 的值。感谢解释。