2012-08-16 56 views
0

可能重复:
Writing to pointer out of bounds after malloc() not causing error我想在C明白的malloc()和realloc()

我想一个非常基本的计划,为的只有2数组分配内存ints。我仅为内存分配了2个ints,即array[0]array[1]:为什么可以使用array[2]并且它的工作正常?

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int *array; 
    int i; 
    array = NULL; 
    array = malloc(sizeof(int)*2); 

    array[0] = 2; 
    array[1] = 3; 
    array[2] = 4; 

    for(i = 0; i<3 ; i++) 
    printf("%d\n", array[i]); 

    return 0; 
} 

输出:

2 
3 
4 

回答

3

这可能出现工作,因为C不会阻止你访问那些不属于你的内存。即使它看起来有效,代码仍然不正确,明天可能无法工作。您通过编写/读取不属于您的内存来调用未定义的行为。

0

因为C不会试图握住你的手。您可以读取/写入未分配的内存,但您可以修改/从其他对象提取数据,或者只是拉取垃圾数据。

当你创建一个数组的时候,你会得到一个指向内存地址的指针,然后你可以使用它。通过分配内存,可以防止在该内存块中创建其他对象,就像您为阵列预留了它一样。然而,没有限制超过这个数量,你可以随时随地阅读和写信。这方面的好处是,你有相当的权力,可以直接操纵地址。缺点是你可以很容易地导致你的程序破坏我在属于其他对象的内存位置上的操纵信息。

从这个事情中解脱出来的是C给了你大量的权力,并且把权力的使用全部留给你。

3

阅读答案here为了更好地理解

它在本质内存腐败解释here

尝试使用一个非常大的数字,而不是4,它会产生错误,因为当你调用malloc()一小块的内存是从一个更大的页面雕刻出来的。所以超出你的大块的范围并不一定意味着你会崩溃。在数组[4]中,您不会为为该初始块分配的页面边界外写入数据,因此您在技术上正在写入有效的映射地址。 Source

2

pb2q是绝对正确的。一种方法可能是验证您正在访问未分配的内存将是做到以下几点:

array = calloc(sizeof(int) * 2); 
for (i = 0; i < 3; i++) 
    printf("%d\n", array[i]); 

,您可能会收到以下输出:

0 
0 
*random value* 
+0

是否有任何函数可以让我的'信号值'填充内存块? – parallelgeek 2012-08-16 18:29:03

0

我相信它的作品,因为你的实现malloc在内存块之前和之后放置一些信息,并且可以分块(例如,将分配请求四舍五入到最近的64个字节)。ed内存必须能够被释放,并且这需要关于其大小等的一些信息,这些信息被放在分配的内存之前和/或之后。

如果数据是以块的形式分配的,那么将会有一些限制,您可以达到您完全填满一个“块”的位置,并且array[n]的读取将在“块”的末尾。对于出界段错误

int main() { 
    int i; 
    char * a; 
    for (i = 1; i < 10000; i++) { 
     a = malloc(i); 
     a[i] = 'x'; 
     printf("%d %c\n", i, a[i]); 
     free(a); 
    } 
    return 0; 
} 

malloc日益内存较大的块,并检查:我们可以测试这个如下。我得到的截断输出是:

1 x 
[...] 
58 x 
59 x 
60 x 
61 x 
62 x 
*** glibc detected *** ./a.out: free(): invalid next size (normal): 0x0a041008 *** 
[...] 

即,试图做a = malloc(63); a[63] = 'x';失败,因为它破坏了我之前讨论过的元数据。

0

这里的窍门:您必须避免使用上的功能中的printf的...只使用它内部的主()(:

,当您使用malloc和realloc,C将分配内存大小它不会分配另一个“地方”来放置一个数字,唯一发生的是如果你放入的数据具有相同的字节大小,这通常发生,因为C不会告诉如果数组大小已满,请注意这一点

+1

Riiiight。等等,什么? – netcoder 2012-08-16 18:16:28