#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;
的x
或printf("%d ", y[i]);
的y
(如x[0]
或y[0]
(都会调用未定义的行为,因为您将尝试对未分配的内存进行写入和读取。
">那么这意味着如果我没有足够的缓冲区,它也会给
i < 4
一个分段错误";
没错。你知道,这对未定义的行为来说是件坏事。它不需要提供错误的结果或错误。因此,i < 4
代码也被破坏了。
自从你写信给";仅";在分配的内存后12个字节(因为sizeof(int)
常见的是4
(,它可能已经工作了,因为此后内存中没有其他必要的信息,但您的代码仍然完全损坏了。
您定义的内存少于您使用的内存,导致程序在该内存区域后写入并更改程序堆栈,这也是C和C++中缓冲区溢出漏洞的情况,增加缓冲区大小