malloc程序中的错误 #包括 #包括 //使用malloc void main(){ int n,i; printf(“输入n\n的大小”); scanf(“%d”和“&n”); int*A=(int*)malloc(sizeof(int)*n); /*对于(i=0;i

malloc程序中的错误 #包括 #包括 //使用malloc void main(){ int n,i; printf(“输入n\n的大小”); scanf(“%d”和“&n”); int*A=(int*)malloc(sizeof(int)*n); /*对于(i=0;i,c,C,malloc不要将分配的空间初始化为0,但这并不意味着您将无法获得0。访问未初始化的内存将给出不确定的值(未指定的值或陷阱表示) 引述自: […]使用Unitized值本身并不是未定义的行为,但该值只是不确定的。如果该值恰好是该类型的陷阱表示,则访问该值就是UB malloc不要将分配的空间初始化为0,但这并不意味着您将无法获得0。访问未初始化的内存将给您提供不确定的值(未指定的值或陷阱表示) 引述自: […]使用Unitized值本身并不是未定义的行为,但该值只是不确定的。如果该值恰好是该类型

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

引述自:

[…]使用Unitized值本身并不是未定义的行为,但该值只是不确定的。如果该值恰好是该类型的陷阱表示,则访问该值就是UB


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

引述自:

[…]使用Unitized值本身并不是未定义的行为,但该值只是不确定的。如果该值恰好是该类型的陷阱表示,则访问该值就是UB


没有规定将
malloc()
返回的内存设置为任何特定值,它只是未定义。“所有零”肯定在“任何值”的范围内。您不能依赖于内存是否为零,但也不能依赖于它是否为零。

没有规定
malloc()返回的内存为零
被设置为任何特定的值,只是没有定义。“所有的零”当然在“任何”的范围内。你不能依赖于内存被归零,但你也不能依赖于它没有被归零。

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

因此,如果你问为什么
0
,我会说我无法解释未定义的行为。在某些系统上,你可能无法得到
0
malloc()
不能保证将分配的内存初始化为
0
,因此人们使用类似
memset()
的东西来初始化分配的空间。

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


因此,如果你问为什么
0
,我说我无法解释未定义的行为。在某些系统上,你可能无法获得
0
malloc()
不能保证将分配的内存初始化为
0
,因此人们使用类似
memset()的东西
初始化分配的空间。

这是您的程序在我的计算机上的输出:

#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");

}
不是全是零

我再次运行它:

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

这就是为什么它被称为“未定义的行为”(
UB
对于朋友):-D

这是您的程序在我的计算机上的输出:

#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");

}
不是全是零

我再次运行它:

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


这就是为什么它被称为“未定义的行为”(
UB
用于朋友):-D

值是未定义的,是的,但我不认为仅仅通过读取未初始化的内存就可以获得完整的未定义行为。@Kevin分配的内存未初始化,访问未初始化的位置会导致UBi读取,如果不将任何值存储到数组中,它将接受垃圾值,但当我编译此程序时ram我得到零作为输出…@Gopi:它稍微复杂一些…但作为一级近似值已经足够好了。如果类型有陷阱表示(实现定义),或者它是一个无记忆的自动变量(可以用
寄存器定义)
),它是UB。在任何当前系统上,第一个不太可能是
int
,第二个在这里没有考虑。@Gopi;我改变了主意。行为不是未定义的,但值是不确定的。值是未定义的,是的,但我不认为仅仅通过读取未初始化的内存就可以得到未定义的行为。@Kevin分配的备忘录ry未初始化,访问未初始化的位置会导致UBi读取,如果您不将任何值存储到数组中,它将接受垃圾值,但当我编译此程序时,我得到的输出为零…@Gopi:稍微复杂一些…但作为第一近似值已经足够了。如果类型具有陷阱表示,则(实现定义),或者它是一个无记忆的自动变量(可以用
寄存器定义),它是UB。第一个不太可能在任何当前系统上使用
int
,第二个不考虑。@Gopi;我改变了主意。行为不是未定义的,但值是不确定的。它是
int main()
。另外,。不要忘记
scanf
malloc
可能会失败。也不要忘记用户可能会输入负值。在@Kevin的注释上展开,或者签名溢出未定义。@使用
sizeof(int)*n可以进行重复数据消除或无符号溢出,除非不太可能的
sizeof(int)>sizeof(size\t)
。这是
int main()
。另外,。不要忘记
scanf
malloc
可能会失败。也不要忘记用户可能会输入负值。在@Kevin注释上展开,或者签名溢出未定义。@除非不太可能的
sizeof(int)*n
,否则重复数据消除或无符号溢出是可能的(int)>sizeof(size\u t)
。万岁,在几次执行之后,我得到了整整30个零不完全是UB,请看,好吧。这不是未定义的行为,它只是随机数据。随机意味着任何东西。如果你不能事先知道你会得到它,即使是一堆零也是随机数据。我认为我们如何命名它不太重要。
malloc()
不能保证任何abo