#include<stdio.h>
#include<stdlib.h>
// using malloc
void main(){
int n,i;
printf("Enter size of n \n");
scanf("%d",&n);
int *A = (int*)malloc( sizeof(int) * n );
/* for(i=0;i<n;i++){
A[i] = i+1;
}*/
printf("Values in Array \n");
for(i=0;i<n;i++){
printf("%d ",A[i]);
}
printf("\n");
}
在这段代码中我必须将输出作为垃圾值 但我为什么要全部为零? (为什么我期待垃圾值是malloc默认分配是垃圾值)
抱歉英语不好......答案 0 :(得分:5)
没有规则malloc()
返回的内存特别设置为任何内容,它只是未定义。 &#34;全部为零&#34;肯定在&#34;任何事情的范围内#34;。您无法依赖将内存归零,但您无法依赖 归零。
答案 1 :(得分:2)
malloc
不会将已分配的空间初始化为0
,但这并不意味着您不会获得0
。访问未初始化的内存将为您提供不确定的值(未指定的值或陷阱表示)。
引自this answer:
[...]使用单位化值本身并不是未定义的行为,但该值只是不确定的。如果该值恰好是该类型的陷阱表示,那么访问它就是UB。
答案 2 :(得分:1)
malloc()
做了什么,它在堆上分配了一些内存并返回指向已分配内存的指针。因此,如果您在向其写入内容之前尝试读取已分配内存中的值,则行为未定义。
所以,如果你问为什么0
,那么我说我无法解释未定义的行为。在某些系统上,您可能无法获得0
。 malloc()
不保证将分配的内存初始化为0
,因此人们会使用类似memset()
的内容来初始化已分配的空间。
答案 3 :(得分:1)
这是我的计算机上程序的输出:
Enter size of n
30
Values in Array
0 -268435456 0 -268435456 2100953104 32767 -1897535813 32767 2100998344 32767 -1897535812 32767 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
不是全部为零。
我又跑了一次:
Enter size of n
30
Values in Array
0 -1610612736 0 -1610612736 2100953104 32767 -1897535813 32767 2100998344 32767 -1897535812 32767 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
再次:
Enter size of n
30
Values in Array
0 268435456 0 268435456 2100953104 32767 -1897535813 32767 2100998344 32767 -1897535812 32767 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
这就是为什么它被称为&#34;未定义的行为&#34; (朋友的UB
):-D