0

编译时,我在 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

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

4

2 回答 2

1

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

为什么?你在那里写了5。当然,您写入“越界”空间,这是一个问题。C 标准未指定实现应如何处理,这是未定义行为的要点,但如果只是简单地这样做,那么(通常)会发生什么,要么您仍在进程的地址空间内,要么操作系统会在运行时给你一个分段错误(又名内存访问冲突)。请注意,这在编译时无法确定,并且可能因运行和系统而异(关于未定义行为的更多点)。

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

于 2013-08-30T12:07:13.830 回答
0

Have a look at this link : Sample Code

What i have observed is *arr is storing the starting address of the array and as you are initializing a[6]=5 whats happening is arr+6 the sixth location in the memory from starting is getting filled up with the value you have put and at the time of printing as it is a valid address its printing the value in the address

Update 1:
As long as the value is not modified by other process it outputs the value in that address space.

于 2013-08-30T12:09:19.233 回答