在C语言中使用#符号的用途

4

我正在参加一项在线C语言测试(不是为了找工作,只是自己学习),但是我总是遇到使用井号的这种类型的问题。我认为这不是拼写错误,而且我也不熟悉井号的这种用法。

#include <stdio.h>
int* func()
{
    int num = 10;
    return #
}
int main()
{
    int *ptr = func();
    printf("%d\n", *ptr);
    return 0;
}

以上C代码的输出是什么?

答案是运行时错误,其解释为:

函数中定义的变量将被分配到堆栈段中,在函数返回时将被删除。因此,访问这些变量的地址会导致分段错误。


2
如果你准确地复制了 return # 行,那看起来像是测试的问题。return 缺少返回值和分号。 - user2357112
4
我从未见过那个。我的C编译器(GNU GCC 6.4.0)显示了这个错误:error: stray ‘#’ in program - Pablo
好的,这一定是个打字错误。这让我感到很烦躁。谢谢。 - Richard Johnson
6
应该有的代码是 return &num;。看起来讲师将其放入了没有适当编码的 HTML 页面中。&num;# 字符的 HTML 实体。 - Barmar
2个回答

25

创建这个测试的人没有正确编码他们的HTML。他们想要那一行看起来像这样:

return &num;

他们直接将内容插入到测试页面的HTML中,忘记了用&XXX;这种方式输入HTML实体。&num;是代表井号#的实体。他们应该这样写:

他们将其直接放入测试页面的 HTML 中,忘记了使用&XXX;来输入 HTML 实体。 &num; 是代表符号#的实体。他们本应该这样编写:

return &amp;num;

&amp; 是代表字符 & 的实体。


哦,这很有趣,现在一切都变得清晰了。非常感谢。 - Richard Johnson
5
他们本应该将 C 代码以纯文本形式编写,然后使用一些工具将其转换为有效的 HTML。 - Keith Thompson
7
非常好的发现!令人惊奇的是,一个微小的错误就足以让你对试图教授编程知识的整个网站质量有一个很好的印象 :-) - Sergey Kalinichenko

0
函数func()返回一个指向变量num的指针。但是num是函数func()内部的自动变量。它存储在堆栈中,其生命周期仅限于函数本身的生命周期。因此,如果您尝试在main()中访问该指针,将会出现分段错误,因为num已经不存在了,因此指针实际上并没有指向任何东西。
编辑:
哈希符号#用于定义宏和头文件。return # --> 这似乎只是问题中的拼写错误。因此,由于指针,唯一的错误是分段错误。

1
这是一个不错的回答,但它解释了一些原帖作者已经知道的内容。他想知道#符号的含义,而你的回答并没有解释清楚。 - Sergey Kalinichenko
1
我觉得他可能在想段错误是如何发生的。无论如何,已经编辑好了。 - Mitu Raj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接