1
2
所发生的情况是,编译器会做它通常会做的任何事情来传递一个参数(把它推到堆栈上,把它放在指定的寄存器中,等等)。但是,用错误的参数数调用函数是未定义的行为,因此不能保证程序会崩溃,或者编译器会使 monkeys fly out of your nose . |
2
2
假设您忽略了它应该给您的所有编译器警告,您可以这样想:
您的代码试图调用一个函数,该函数接受两个int,并返回一个int。根据调用约定,参数可能在cpu或堆栈的寄存器中传递,输出可能会传递到寄存器。这个
不管怎样,你在这里调用未定义的行为。尝试改变
|
3
1
您的代码中包含返回int*的函数的类型—您需要指向返回int的函数的指针。更改后,这一行:
给了我:
与gcc合作。你原来的代码也给了我多个警告,顺便说一句-你用的是哪种编译器?如果你的问题真的是“为什么这个代码看起来有效?”嗯,这是不确定行为的乐趣之一。 |
4
1
下面是一个未定义行为的示例
作品
|
5
0
编译器仍然会生成将两个参数推入其中的代码
|
6
0
要理解它的工作原理,您需要了解一点汇编语言以及C如何使用
the stack
传递参数。您可以将堆栈可视化为一个大的板堆栈,其中每个板包含一个简单变量。在许多平台上,所有参数都在堆栈上传递。
下面是堆栈在invalid中的外观:
这也是如何
在C语言的早期,函数声明根本不包含参数。事实上,如果你声明一个函数时括号之间没有任何东西,你仍然可以这样定义一个函数。例如,这可以很好地编译:
这就是为什么把
|
Community wiki · C中有哪些耗时的操作? 1 年前 |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |