gpt4 book ai didi

c - malloc 与数组,无法理解为什么这有效

转载 作者:行者123 更新时间:2023-11-30 16:56:25 24 4
gpt4 key购买 nike

我正在尝试实现一个简单的筛子,在我的帮助下,我发现了以下代码:

int main(int argc, char *argv[])
{
int *array, n=10;
array =(int *)malloc(sizeof(int));
sieve(array,n);
return 0;
}

void sieve(int *a, int n)
{
int i=0, j=0;

for(i=2; i<=n; i++) {
a[i] = 1;
}
...

出于某种原因,这可行,但我认为不应该!为变量数组分配的空间仅足以支持一个整数,但在函数 sieve 中调用 i = 2...10 的 a[i]。这不应该引起问题吗?

我尝试将实现更改为

int array[10], n = 10; 

这导致运行时出现“Abort trap: 6”。但是,我理解这一点,因为 array[10] 将位于分配的空间之外。但我使用 malloc 的代码不应该也是如此吗?

确实令人困惑。

最佳答案

你在某些方面是正确的。例如这一行:

array =(int *)malloc(sizeof(int));

只为一个整数分配空间,而不是10。它应该是:

array =(int *)malloc(sizeof(int) * 10);

但是,这并不意味着代码会失败。至少不是立即。当您从 malloc 取回指针,然后开始写入超出已分配内容的范围时,您可能会破坏内存中的某些内容

也许您正在编写 malloc 用于跟踪其请求内容的结构,也许您正在编写其他人的内存分配。也许什么也没有 - malloc 通常会分配比要求的更多的内容,以保持其分配的 block 易于管理。

如果你想让某些东西崩溃,你通常必须在操作系统页面边界之外乱写乱画。如果您使用的是 Windows 或 Linux 或其他操作系统,操作系统将在一组 block 中为您提供(或在本例中为 malloc)一些内存,通常大小为 4096 字节。如果您在该 block 内乱写乱画,操作系统将不会关心。如果你超出它,你将导致页面错误,操作系统通常会破坏你的进程。

在 MS-DOS 时代,这要有趣得多。这不是一个“保护模式”操作系统 - 它没有像 Windows 或 Linux 那样的硬件强制页面边界。在你的区域之外乱涂乱画可能会发生任何事情!

关于c - malloc 与数组,无法理解为什么这有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39923272/

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