c-VirtualBox,GCC和Malloc没有给出直观的答案



编译以下内容时,我在VirtualBox中运行科学linux时遇到了一个奇怪的问题:

#include <stdlib.h>
#include <stdio.h>
int main(void) {
    int *arr;
    arr = malloc(sizeof(int)*3);
    arr[6]=5;
    printf("%d", arr[6]);
    return 0;
}

我的期望是,当打印出这个arr[6]时,我应该得到垃圾,因为我没有为这个空间分配足够的内存。

然而,我将使用gcc 编译它

gcc main.c -o MainTest

然后它将输出

5

我可能有点困惑,但这个数字不应该是一些随机数

我可能有点困惑,但这个数字不应该是一些疯狂的垃圾数字吗。

为什么?你在那里写了5。当然,你在"界外"空间里写字,这是一个问题。实现应该如何处理这一点并没有由C标准指定,这是未定义行为的要点,但如果它只是简单地这样做,(通常)会发生的情况是,要么你仍然在进程的地址空间内,要么操作系统在运行时会给你一个分段错误(也称为内存访问违规)。请注意,这在编译时是不可确定的,并且可能因运行和系统而异(关于未定义行为的更多信息)。

如果您仍在进程地址空间内,则仍然存在重大问题,因为您可能覆盖了为其他目的分配的内容;C不会保护你免受这种影响,这可能会产生非常讨厌的难以解决的错误。

看看这个链接:样本代码

我观察到的是*arr存储数组的起始地址,当你初始化a[6]=5时,发生的事情是arr+6,从起始开始,内存中的第六个位置被你输入的值填满,在打印时,因为它是一个有效的地址,所以它打印地址中的值

更新1:
只要该值没有被其他进程修改,它就会输出该地址空间中的值。

相关内容

  • 没有找到相关文章

最新更新