当前位置: 首页 > 知识库问答 >
问题:

从没有返回的函数返回值[重复]

阚砚文
2023-03-14
#include<stdio.h>

int add(int a, int b)
{
    int c = a + b;

    ;there isn't return
}

int main(void)
{
    int res = add(3, 2);

    return 0;
}
5
push   rbp
mov    rbp, rsp
mov    DWORD PTR[rbp-0x14], edi  ;store first
mov    DWORD PTR[rbp-0x18], esi  ;store second
mov    edx, DWORD PTR[rbp-0x14]
mov    eax, DWORD PTR[rbp-0x18]
add    eax, esx
mov    DWORD PTR[rbp-0x4], eax
nop
pop    rbp
ret
push   rbp
mov    rbp, rsp
sub    rsp, 0x10
mov    esi, 0x2    ;first parameter
mov    edi, 0x3    ;second parameter
call   0x1129 <add>

;WHAT??? eax = a + b, why store it?
mov    DWORD PTR[rbp-0x4], eax 
mov    eax, 0x0
leave
ret

如您所见,它将参数aB的和保存在变量C中,然后将包含它们的和的eax寄存器保存在变量Res中,就像函数返回值一样。

这样做是因为函数是用返回值定义的吗?

共有1个答案

夏侯渊
2023-03-14

您所做的是通过未能从函数返回值,然后试图使用该返回值来触发未定义的行为。

C标准第6.9.1P12节对此作了说明:

如果达到了终止函数的},并且调用方使用了函数调用的值,则未定义行为。

 类似资料:
  • 我正在等待(从USSD请求中)检索一个值,以便返回它(getUSSD):

  • 问题内容: 我正在使用Postgresql 8.3,并具有以下简单功能,该功能会将a返回 给客户端 现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但是游标名称是由PostgreSQL自动生成的 此外,如38.7.3.5中所述,显式地将游标名称声明为函数的输入参数 。返回游标。我可以声明自己的游标名称并使用此游标名称来操纵返回的游标,而不是为我自动生成的Postgresql吗?如果不是

  • 你也许注意到了,到现在为止我们使用的一些函数都会给出执行结果,如数学函数;另外一些函数只执行,并不返回任何值,如newLine。于是问题来了: 如果你调用一个函数但并没有用到其返回值,会发生什么(例如,你并不会把这个返回值赋给某个变量,或者把它作为一个更大的表达式的一部分)? 如果你用一个无返回值的函数作为表达式的一部分,如newLine() + 7,会发生什么? 我们可以编写有返回值的函数吗?还

  • Lua 具有一项与众不同的特性,允许函数返回多个值。Lua 的库函数中,有一些就是返回多个值。 示例代码:使用库函数 string.find,在源字符串中查找目标字符串,若查找成功,则返回目标字符串在源字符串中的起始位置和结束位置的下标。 local s, e = string.find("hello world", "llo") print(s, e) -->output 3 5 返回多个值

  • 我一直在做这个岩石剪刀剪刀程序一段时间,它没有显示的方式,它应该是应该的。我在代码中使用了值返回函数。问题在程序的末尾显现出来。游戏的结果将被替换,但实际显示的是另一个提示,供用户输入他们的选择。下面是我的代码:

  • 通过上面的学习,可以知道通过 return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。 不带参数值的 return 语句返回 None。 具体示例: # -*- coding: UTF-8 -*- def sum(num1,num2): # 两数之和 if not (isinstance (num1,(int ,float)) and isinstance (