打印由函数返回的指针的值

15 浏览
0 Comments

打印由函数返回的指针的值

我在尝试以以下方式从另一个文件访问静态变量。\n请帮忙打印出文件1.c中变量\'c\'的值。\n请查看下面的代码:\n文件1.c\n

void main(void)
{
    int m;
    m = func_ret();
    printf("\n m = %d\n", m);
}

\n文件2.c\n

static int c = 5;
int *func_ret(void)
{
    printf("\n c = [%d]\n", c);
    return &c;
}

0
0 Comments

问题出现的原因:

在函数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的地址。

0
0 Comments

这里的问题是,你正在从 func_ret() 函数返回一个指针,然后试图将返回值捕获到一个 int 变量中,然后尝试使用 %d 打印该值。这很可能会导致未定义行为

根据 C11 标准的第 §6.3.2.3 章节规定:

任何指针类型都可以转换为整数类型。除非另有规定,否则其结果是实现定义的。如果结果无法用整数类型表示,则行为是未定义的。结果不需要在任何整数类型的值范围内。

解决方法:你需要将 m 的类型从 int 改为 int *。你还需要使用适当的格式说明符。

另外请注意,main() 的推荐签名是 int main(void)

我也在努力想象为什么有人会对这个答案点踩。

我没有点踩,但在大多数情况下,从指针到整数的转换是无害的。最坏的情况是你会打印出一些垃圾值。

先生,我同意您的观点,但在某些情况下,这可能会引起问题,对吧?所以最好使用推荐和定义好的方式。此外,我认为在提问者的情况下,这是一种疏忽。这个转换并非是有意的。:-)

捕获返回值并不会引起未定义行为,因为地址被存储在整数变量中。问题中的代码片段是有效的,其中 m 打印的是变量 C 的地址,但我想要的是 C 的值。感谢解释。

0