【问题标题】:printing the value at the pointer returned by a function打印函数返回的指针处的值
【发布时间】:2015-09-19 22:45:11
【问题描述】:

我正在尝试通过以下方式从其他文件访问静态变量。 你能帮忙打印file1.c中变量'c'的值吗?

找到下面的代码

文件1.c

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

文件2.c

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

【问题讨论】:

  • int m,---> int m;
  • 你不能,从c的定义中删除静态,它会起作用。

标签: c static


【解决方案1】:

这里的问题是,您从func_ret() 返回一个指针,然后尝试在int 变量中捕获返回值,然后尝试使用%d 打印该值。它主要调用undefined behaviour

供参考,C11,第 §6.3.2.3 章

任何指针类型都可以转换为整数类型。除非前面指定,结果是实现定义的。如果结果不能以整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。

解决方案:您需要将m 的类型从int 更改为int *。您还必须使用适当的格式说明符。

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

【讨论】:

  • 即使我想弄清楚为什么有人会否决这个答案。
  • 我没有投反对票,但在大多数情况下,从指针到 int 的转换是无害的。最坏的情况是你会打印一些垃圾值。
  • @Lundin 先生,我同意你的观点,但在某些情况下,它可能会导致问题,对吧?所以,最好使用推荐和定义的方式,此外,我认为,在 OP 的情况下,这是一个监督问题。转换不是故意的。 :-)
  • 返回值的捕获不会调用未定义的行为,因为地址存储在整数变量中。问题中的代码 sn-p 适用于 m 打印变量 C 的地址的位置,但我想要 C 的值。感谢您的解释
【解决方案2】:

将您的 file1.c 更改为:

#include <stdio.h>

extern int *func_ret(void);

int main(void)
{
    int *m = 0;
    m=func_ret();
    printf("\n m = %d\n",*m);
    //some code
    return 0;
}

file2.c 到:

#include <stdio.h>

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

此外,您应该养成使用int main(void) 而不是void main() 的习惯。 由于该部分实际上不在此问题的范围内,因此我将分享相关问题的链接:
int main(void) vs void main()
Why do we need to use int main and not void main in C++?

【讨论】:

  • 感谢 WedaPashi,您的代码更改有效,我刚刚将返回值分配给一个整数指针变量来代替整数变量。
猜你喜欢
  • 2021-03-16
  • 2018-03-07
  • 2021-04-27
  • 2017-09-05
  • 2013-04-10
  • 2014-08-03
  • 2022-01-15
  • 2018-08-19
相关资源
最近更新 更多