gpt4 book ai didi

c - 指向全局静态变量的指针 - 不安全?

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:31 24 4
gpt4 key购买 nike

我有一个文件,其中有一个全局数组

static char name[6];

还有一个函数

static char* gen_name(char* dest, const size_t len) {
for (int i = 0; i < len - 1; ++i)
dest[i] = 'A' + (genrand_uint32() % ('Z' - 'A'));
dest[len - 1] = '\0';
return dest;
}

然后将指向名称的指针存储在不同头文件中的全局变量中,该变量不是静态的。

this_name = gen_name(name, sizeof name);

当另一个文件中的函数使用这个指针时,它在 Linux 上运行良好,但是当我在微 Controller 上运行相同的代码时,它会打印出垃圾。当我删除 static 关键字时,它工作正常。

为什么会这样?

什么时候应该使用static?我认为我应该将所有未在文件外部使用的变量和函数声明为 static,这是错误的吗?

最佳答案

你在header声明变量的时候,有没有记得标记extern?您需要这样做,否则会发生的情况是您只是在每个包含标题的文件中获得一个新变量。请记住,#include 只是一个复制和粘贴工作;预处理器只是将头文件中的文本插入到包含发生的位置。如果头文件中的文本是 char name[6],那么这就是您得到的;源代码中的文本显示 char name[6],导致变量 name 与您在其他源文件中的变量无关。

如果您将其标记为extern,链接器将提示找不到该符号。这意味着 name 的定义不能是 static,因为这会导致链接器无法找到它。

因此,在您的头文件中,您需要以下声明:

extern char name[6];

在你的源文件中,你需要这个定义:

char name[6];

然后回答实际问题:是的,它非常安全。

关于c - 指向全局静态变量的指针 - 不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19622959/

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