C语言 如何从一个数字文字中得到一个内存地址(指针)?

unftdfkk  于 2023-04-11  发布在  其他
关注(0)|答案(1)|浏览(130)

背景:
我决定在我的程序中使用中立的void指针(void*),因为它是统一的,高效的,我可以将它们转换为上下文中需要的任何内容。
当调用比较函数时,所有的参数/参数都必须作为空指针传递,例如:

compare_integer_equal((void*) &r, p12, (void*) NUMBER_1_INTEGER_STATE_CYBOI_MODEL);

整数常量全局定义为:

static int NUMBER_1_INTEGER_STATE_CYBOI_MODEL_ARRAY[] = { 1 };
static int* NUMBER_1_INTEGER_STATE_CYBOI_MODEL = NUMBER_1_INTEGER_STATE_CYBOI_MODEL_ARRAY;

问题:
这样的常量确实存在于所有经常使用的数字中,并且总计超过2 MB的文件大小,我想消除这一点。当然,我总是可以使用这样的局部变量:

int i = 1;
compare_integer_equal((void*) &r, p12, (void*) &i);

但我想避免这种额外的努力/内存/时间时,必须做数百次比较。当试图从一个字面量的引用,如下面的例子所示,编译器产生的错误:“需要左值作为一元'&'操作数”:

compare_integer_equal((void*) &r, p12, (void*) &1);

有没有一种方法可以从一个字面值得到一个内存地址(指针)?有没有其他的想法来处理字面值为(void*)?

2uluyalo

2uluyalo1#

最好的方法是声明一个具有正确值的正确类型的static const对象,并传递它的地址。虽然C99为复合文字添加了一个方便的语法,但它生成的机器码效率低于使用static const的方法,并且还将产生一个对象的地址,该对象的生命周期将被限制在直接封闭块中。这意味着任何指向该对象的持久化指针都将处于悬空状态。相比之下,任何指向static const对象的指针将在程序的整个生命周期内保持有效。

相关问题