gpt4 book ai didi

c - 运行时检查失败 #2 - 变量 'obj' 周围的堆栈已损坏

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

当我运行以下代码时,出现运行时检查失败 #2 - Stack around the variable 'obj' was corrupted 错误。我知道这是失败的,因为覆盖了 'obj' 的边界导致堆栈损坏。那么这里如何防止缓冲区溢出。

typedef struct _INFO {
int Count;
} Info, *InfoPtr;

#define MAX_COUNT 10

//void fn(Info(*obj)[MAX_COUNT])
void fn(Info (*obj)[MAX_COUNT])
{
for (int i = 0; i < 2; i++)
{
obj[i]->Count = i;
}
}

int main()
{
Info obj[MAX_COUNT];
fn(&obj);
return 1;
}

最佳答案

Info (*obj)[MAX_COUNT]你说obj是指向 MAX_COUNT 数组的指针Info 类型的对象.

但是你可以像obj[i]->Count = i那样使用它对待obj作为指向 Info指针数组对象。 IE。 Info *obj][] .不是一回事。这会导致未定义的行为

解决方案非常简单,不要将指向数组的指针作为参数传递,而是将其视为对象数组而不是指向对象的指针。

typedef struct Info {
int Count;
} Info;

#define MAX_COUNT 10

void fn(Info *obj, const size_t elems)
{
for (size_t i = 0; i < elems; i++)
{
obj[i].Count = i;
}
}

int main()
{
Info obj[MAX_COUNT];
fn(obj, MAX_COUNT);
}

变化最显着的是 fn函数声明,它采用指向 Info指针 .这是因为数组自然会衰减到指向其第一个元素的指针。我还添加了一个参数来保存数组中元素的数量,因此函数知道它。这使得该函数更通用,您可以将不同大小的不同数组传递给它。

我也改成了main函数根本不返回任何东西。自 C99 标准以来 main没有显式 return 的函数将隐式获得 return 0由编译器。并返回 0来自 main功能通常被视为“好”或“没有失败”。返回非零值被视为失败或错误。

我还更改了您的结构的名称。编译器和标准 C 库在所有范围内保留带有前导下划线后跟大写字母的名称(C 或预处理器)。此外,结构标记名称存在于单独的命名空间中,因此您可以使用与类型名称相同的结构名称(类型别名,由 typedef 定义)。我还删除了 InfoPtr type-name,使用这样的指针作为 type-names 会混淆代码并使其可读性和可维护性降低。

关于c - 运行时检查失败 #2 - 变量 'obj' 周围的堆栈已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44433394/

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