在一个奇怪的场景中运行,其中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时,我得到:
所以首先,数组应该是5个元素。但第二,为什么0到底?我只使用10/2 = 5英寸的空间。
编辑:
打印代码:
for (int d = 0; d < numberOfElements; d++) {
printf("%i ", secondArray[d]);
}
嗯,我可能刚刚在这里回答了我自己的问题,我猜这是在secondArray之外的打印显示0,而不是数组本身。
-
实际上,问题在于我也没有这样做:
secondArray[numberOfElements] = '\0';
这就是它打印的原因。
答案 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