相关疑难解决方法(0)

为什么在没有返回值的情况下流出非void函数的末尾不会产生编译器错误?

自从我多年前意识到这一点,默认情况下这不会产生错误(至少在GCC中),我一直想知道为什么?

我知道您可以发出编译器标志来产生警告,但是它不应该总是出错吗?为什么非void函数没有返回值才有效?

评论中要求的示例:

#include <stdio.h>
int stringSize()
{
}

int main()
{
    char cstring[5];
    printf( "the last char is: %c\n", cstring[stringSize()-1] ); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

...编译.

c c++ gcc g++

157
推荐指数
5
解决办法
4万
查看次数

检查函数的返回值而不返回return语句

使用下面的例子,请解释为什么有时候不需要return语句?函数具有返回类型,但缺少return语句.同时,程序编译和工作正常.

请帮助我更好地理解这一点

char* handleInput() {
    fgets(buffer, 1024, stdin);
**//    return buffer;**       <---- COMMENTED RETURN
}

void main() {
        char* ptr = handleInput();
        int flag = atoi(ptr);    
        if (flag < 0) break;    
        printf("You entered: %s\n", ptr);
}
Run Code Online (Sandbox Code Playgroud)

c return-value

2
推荐指数
2
解决办法
1662
查看次数

从没有返回的函数中返回一个值

我想我发现 gcc 编译器处理函数的方式有问题。

我不知道这是一个错误还是我多年来忽略的东西从来没有分心。实际上,通过声明一个函数并定义后者具有返回值,编译器将在函数范围内分配的第一个变量的值存储在 EAX 寄存器中,然后依次将其存储在一个变量中。例子:

#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;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

5
Run Code Online (Sandbox Code Playgroud)

这是具有 intel 语法的 x86-64 程序集:

功能添加:

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
Run Code Online (Sandbox Code Playgroud)

主要功能:

push …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc undefined-behavior

0
推荐指数
1
解决办法
94
查看次数

标签 统计

c ×3

gcc ×2

assembly ×1

c++ ×1

g++ ×1

return-value ×1

undefined-behavior ×1