malloc程序出错

时间:2015-01-16 16:14:20

标签: c

#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默认分配是垃圾值)

抱歉英语不好......

4 个答案:

答案 0 :(得分:5)

没有规则malloc()返回的内存特别设置为任何内容,它只是未定义。 &#34;全部为零&#34;肯定在&#34;任何事情的范围内#34;。您无法依赖将内存归零,但您无法依赖 归零。

答案 1 :(得分:2)

malloc不会将已分配的空间初始化为0,但这并不意味着您不会获得0。访问未初始化的内存将为您提供不确定的值(未指定的值或陷阱表示)。

引自this answer

  

[...]使用单位化值本身并不是未定义的行为,但该值只是不确定的。如果该值恰好是该类型的陷阱表示,那么访问它就是UB。

答案 2 :(得分:1)

malloc()做了什么,它在堆上分配了一些内存并返回指向已分配内存的指针。因此,如果您在向其写入内容之前尝试读取已分配内存中的值,则行为未定义。

所以,如果你问为什么0,那么我说我无法解释未定义的行为。在某些系统上,您可能无法获得0malloc()不保证将分配的内存初始化为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