【发布时间】:2014-03-19 13:14:48
【问题描述】:
我最近在学习Linux C编程,有个问题困扰了我很久。问题是当我们使用malloc分配一些内存时,我们可以使用超出我们所需大小的地址,但是当我们访问的地址比我们需要的大,系统可能会杀死我们的进程。就像下面的代码:
int *p = malloc(10*sizeof(int));
*(p + 10) = 1;
当我们使用这个子句时,系统可能不会杀死我们的进程,但是当我们使用时:
*(p +10000) = 1;
系统可能会杀死我们的进程。 那么系统为什么会这样呢?
【问题讨论】:
-
通过“系统杀死我们的进程”我假设你的意思是segmentation fault 正在发生?读取分配的内存是 C 未定义的行为,通常会导致段错误。
-
如果你运气不好,
*(p+10)=1;可能会崩溃,这肯定会破坏你的记忆(因为最后一个有效索引是 9)。使用valgrind -
实际上 p+10 有效,因为 malloc 分配了 10 个 int 大小的内存空间,并且还留下了一个指向下一个要使用的内存地址的指针。但仅此而已。所以 *(p+10) 存在,*(p+11) 以后不存在。但是避免将数据强制转换到 malloc 指示的下一个内存槽,因为它们将被下一个 malloc 上的程序使用,并且,在最好的情况下,您将丢失信息(最坏的情况,程序会崩溃)
-
您可能对stackoverflow.com/questions/20312340/… 感兴趣(即使从标题中看不出来)