通过在C中更改函数调用来节省代码空间

Jer*_*emy -3 c null void-pointers

我正在调用一个通过指针参数返回变量的函数.我不关心这个参数的返回值,也不想让虚拟变量传递给函数.举一个简单的例子,假设函数如下,我不关心,也不想为参数"d"创建一个虚拟变量.

void foo(int a, int b, int* c, int* d)
{
*c = a+b;
*d = a+b+*c;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,NULL指针理论上是一个指向不是任何对象或函数地址的位置的指针.如果将NULL定义如下,那么在此函数中将NULL传递给"d"是否正确?或者这是否会改变内存中第0个元素的内容?

#define NULL ((void *)0)
Run Code Online (Sandbox Code Playgroud)

目标设备是MSP430,我正在使用IAR C. 没有使用操作系统,因此没有实现内存管理

编辑:请注意,我不想创建虚拟变量.此外,如果有一种方法可以欺骗编译器在不改变函数定义的情况下优化"d"参数,这是更可取的.

编辑#2:我宁愿不在函数调用中使用&运算符,因为它会生成我不想生成的低效代码

编辑#3:对于那些在我谈论&运算符时不相信我的人......编译器手册指出"避免使用&运算符来获取局部变量的地址.这主要有两个原因:效率低.首先,变量必须放在内存中,因此不能放在处理器寄存器中.这会导致代码越来越大.其次,优化器不能再认为局部变量不受函数调用的影响."

Eri*_*hil 7

不,这不对.

执行此操作时,C标准未定义行为.在许多系统上,当foo尝试存储到地址0 时,它将导致错误(某种内存故障).如果没有,那么您将写入数据到地址0,可能会覆盖可能需要的其他内容,所以你的系统可能会在以后失败.

  • @Jeremy:内存故障由硬件启动,而不是由操作系统启动.但是,如果您正在配置硬件以便写入地址零不会导致内存故障,那么您实际上是在地址零处创建一个虚拟变量.此外,您依赖于C规范无法保证的编译器行为.这在嵌入式平台中很常见,但您应该确保您的编译器支持您正在执行的操作. (7认同)