gpt4 book ai didi

c - 在 C 中是否可以创建一个无法计算地址的文件范围对象?

转载 作者:行者123 更新时间:2023-11-30 18:40:13 25 4
gpt4 key购买 nike

我想要的是确保文件范围变量(在我的程序中)不能从文件外部修改。所以我将它们声明为“静态”以排除外部链接。但我还想确保这个变量不能通过指针修改。

我想要类似于“寄存器”存储类的东西,其中

the address of any part of an object declared with storage-class specifier register cannot be computed, either explicitly (by use of the unary & operator) or implicitly (by converting an array name to a pointer).

但没有“register”关键字的限制(不能在文件范围变量上使用,声明为寄存器的数组不能被索引)。

也就是说,

<new-keyword> int array[SIZE] = {0};

int a = array[0]; /* should be valid */
int *p = array; /* should be INVALID */
p = &array[3]; /* should be INVALID */

实现这一目标的最佳方法是什么?

为什么我需要这样的功能?
使用场景是这个文件将来会被很多人修改,即使我无法亲自概览所有修改。我想尽可能多地排除潜在的错误。在这种情况下,我想确保对模块来说“私有(private)”的变量将保持不变,而不必仅仅依赖于文档和/或规则

最佳答案

不,我认为你不能这样做,至少不能干净利落地这样做。但我也无法完全理解你的用例。

如果您的对象是静态,那么在您的模块之外没有人知道它的名称。所以没有人可以使用 & 来获取它的地址。

如果您需要公开它,并且不希望程序的其他部分修改它,请编写一个将其公开为常量指针的函数:

static int array[SIZE];

const int * get_array(void)
{
return array;
}

然后编译时出现警告。如果有人抛弃了 const,那是他们的问题。

关于c - 在 C 中是否可以创建一个无法计算地址的文件范围对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26804448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com