gpt4 book ai didi

linux - 如何防止堆栈变量在 GCC 中覆盖 C++ 中的静态数组?

转载 作者:太空宇宙 更新时间:2023-11-04 11:35:10 25 4
gpt4 key购买 nike

我有一个问题,在堆栈上声明为自动变量的数组会覆盖静态声明的数组。由于规模和知识产权的原因,我无法引用确切的代码,但大纲如下。

我有以下结构:

struct mystruct_type {
const int list_size;
const int* list;
};

我有一个包含这些结构的全局静态数组:

struct mystruct_type mystruct_ar[] = {
{3, (int[]){1, 2, 3}},
{2, (int[]){1, 3}},
{5, (int[]){4, 2, 3, 4, 5}}
};

这个数组在编译成库的源文件中。

我有另一个源文件被编译到另一个具有自动数组的库中:

void my_func(void) 
{
char my_string[1000];

// etc...
}

当这一切链接在一起时,我看到 mystruct_ar一个list 的地址与 重叠my_string,当我将某些内容复制到 my_string 时,它会覆盖 list 中的元素,从而导致各种问题。

我对编译器和链接器如何工作的理解是,静态数组及其所有子数组属于一个内存区域,而堆栈(在其上声明 my_string)位于一个单独的非重叠区域。是什么导致了这种重叠?我可以检查什么?

我在 SuSE10 Linux (x86-64_linux26) 上使用 GCC 4.3.2。一切都是静态链接的。

编辑: 下面的一些评论说这不能编译。他们是对的。在清理我的演示文稿片段的过程中,我忽略了将 list 数组转换为 int[]。这已在上面修复。

最佳答案

我认为这段代码无法编译。具体来说,您不能在 mystruct_ar 中为列表指针传递 { list, of, ints }。您必须在上面分别声明每个整数数组。

您需要提供一个连贯的示例来实际演示错误,或者如果失败,则提供实际的代码片段。

关于linux - 如何防止堆栈变量在 GCC 中覆盖 C++ 中的静态数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8554827/

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