C语言中,整型函数若在调用时未获得return值,此时其值是如何确定的?

Ivar
  • 65

编译是可通过的,但由于一个语义错误,所以导致程序运行调用该int型函数是没有获得return值,输出了没有实际意义的数字(虽然看上去是有意义的,就像int数组越界时输出的值)

回复
阅读 2.3k
2 个回答
同意并接受
  • 7.2k

没代码,瞎猜~

一般返回值在 EAX 寄存器

没将返回值写到eax中,但调用者依旧去读取eax的值,谁也不知道是个啥~~


下面是一个例子,和你的代码结构差不多~

看一下汇编,就知道 EAX 寄存器的作用了

c代码

#include <stdio.h>
#define false 0
int GetData(int flg)
{
    while(false)
        if(flg)
            return(1);
        else
            return(-1);
}

void main(){
    int retval;
    retval = GetData(false);
    printf("%d",retval);
    getchar();
}

对应的汇编代码

int GetData(int flg)
{
 push        ebp  
 mov         ebp,esp  
 sub         esp,0C0h  
 push        ebx  
 push        esi  
 push        edi  
 lea         edi,[ebp-0C0h]  
 mov         ecx,30h  
 mov         eax,0CCCCCCCCh  
 rep stos    dword ptr es:[edi]  
    while(false)
 xor         eax,eax  
 je          GetData+36h (4113D6h)  
        if(flg)
 xor         eax,eax  
 je          GetData+2Fh (4113CFh)  
            return(1);
 mov         eax,1  ;在 EAX 中写入返回值:1
 jmp         GetData+36h (4113D6h)  
        else
 jmp         GetData+34h (4113D4h)  
            return(-1);
 or          eax,0FFFFFFFFh  ;在 EAX 中写入返回值:-1
 jmp         GetData+36h (4113D6h)  
 jmp         GetData+1Eh (4113BEh)  
}

void main(){
 push        ebp  
 mov         ebp,esp  
 sub         esp,0CCh  
 push        ebx  
 push        esi  
 push        edi  
 lea         edi,[ebp-0CCh]  
 mov         ecx,33h  
 mov         eax,0CCCCCCCCh  
 rep stos    dword ptr es:[edi]  
    int retval;
    retval = GetData(false);
 call        @ILT+225(_GetData) (4110E6h)  
 mov         dword ptr [ret],eax  ;将 eax 的返回值写到 内存中的变量 
    printf("%d",retval);
 mov         esi,esp  
 mov         eax,dword ptr [ret]  
 push        eax  
 push        offset string "%d" (41573Ch)  
 call        dword ptr [__imp__printf (4182B4h)]  
 add         esp,8  
 cmp         esi,esp  
 call        @ILT+300(__RTC_CheckEsp) (411131h)  
    getchar();
 mov         esi,esp  
 call        dword ptr [__imp__getchar (4182B8h)]  
 cmp         esi,esp  
 call        @ILT+300(__RTC_CheckEsp) (411131h)  
}

看了你的代码,函数内为什么要while循环,直接if else判断不就可以了吗?满足条件就输出L->element[i],否则就是-1

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏