c-为什么这个代码在i较小时有效,但在i较大时出现分段错误


#include <stdio.h>
int main(void) {
int *x, *y;
x = malloc(sizeof(int));
for (int i = 0; i < 4; i++)
x[i] = i + 1;
y = x;
for (int i = 0; i < 4; i++)
printf("%d ", y[i]);
}

这将正确工作并输出1 2 3 4。但当CCD_ 2出现分割错误时。有人能解释一下吗?

您需要分配足够大的缓冲区。您只分配sizeof(int(,它通常是4个字节,并且足够大,只能容纳一个整数。无法在其中存储1000000个元素。它完全偶然地对4个元素起作用,可能是因为尽管您在重写内存,但并没有破坏任何重要的内容。像这样的东西是你应该使用的。

#include <stdio.h>
int main(void)
{
int count = 1000000;
int *x, *y;
x = malloc(sizeof(int) * count);
for (int i=0; i < count; i++)
x[i] = i+1;
y = x;
for (int i=0; i < count; i++)
printf("%d ", y[i]);

}

未定义的行为是未定义的,您无法证明任何结果的合理性。

您为一个整数分配了内存,当您试图取消引用该范围之外的内存(即i==1(时,您正在调用UB。唯一有效的访问权限仅为x[0]x[0]

您只为一个int:分配了内存

x = malloc(sizeof(int));   // malloc allocates a memory chunk to only hold one int object.

在循环中,用i的值0以外的任何值索引x[i] = i+1;xprintf("%d ", y[i]);y(如x[0]y[0](都会调用未定义的行为,因为您将尝试对未分配的内存进行写入和读取。

">那么这意味着如果我没有足够的缓冲区,它也会给i < 4一个分段错误";

没错。你知道,这对未定义的行为来说是件坏事。它不需要提供错误的结果或错误。因此,i < 4代码也被破坏了。

自从你写信给";仅";在分配的内存后12个字节(因为sizeof(int)常见的是4(,它可能已经工作了,因为此后内存中没有其他必要的信息,但您的代码仍然完全损坏了。

您定义的内存少于您使用的内存,导致程序在该内存区域后写入并更改程序堆栈,这也是C和C++中缓冲区溢出漏洞的情况,增加缓冲区大小

相关内容

  • 没有找到相关文章

最新更新