C - malloc分配太多内存

时间:2014-02-26 05:12:09

标签: c arrays malloc

在一个奇怪的场景中运行,其中malloc分配的内存比我要求的多:

void function (int array [], int numberOfElements) {

int *secondArray = malloc(sizeof(int) * numberOfElements/2);

for (int i = 0; i < numberOfElements / 2; i++) {
    secondArray[i] = array[i];
  }
} 

假设数组是大约10个数字。当我在上面的代码之后打印出secondArray时,我得到:

enter image description here

所以首先,数组应该是5个元素。但第二,为什么0到底?我只使用10/2 = 5英寸的空间。

编辑:

打印代码:

for (int d = 0; d < numberOfElements; d++) {
   printf("%i ", secondArray[d]);
}
嗯,我可能刚刚在这里回答了我自己的问题,我猜这是在secondArray之外的打印显示0,而不是数组本身。

-

实际上,问题在于我也没有这样做:

secondArray[numberOfElements] = '\0';

这就是它打印的原因。

3 个答案:

答案 0 :(得分:2)

malloc实际上分配的金额恰到好处。

但是,您正在访问超出分配范围的内存。

存在的东西是完全未定义的,可能真的是什么。

在你的情况下,它是一个“垃圾”号和四个零。

答案 1 :(得分:0)

你很幸运。 Malloc可以并且有时会从操作系统的更多内存中询问 - 考虑到分页。有时它甚至不需要向操作系统询问内存,因为它已经要求更早。因此,malloc可以请求一页内存 - 更多的内容足以满足您的请求,并且额外的内存恰好用零填充。

你处于未定义行为的境地。所以所有的赌注都没有了。

答案 2 :(得分:0)

its print 0 0 0 0 because in C no array bound if you define your array size is 4 but u
want to store data more than array size you can store so you print your array
for(i = 0; i < numberOfElements; i++) its give data and 0 also because you store the data 
only 5 position but you print it max size so it give you 0 0 0 

int *secondArray = malloc(sizeof(int) * numberOfElements/2); // no matter either use it or
int *secondArray = malloc(sizeof(int));
// this will take same memory