动态数组是在没有malloc的情况下分配的

动态数组是在没有malloc的情况下分配的,c,arrays,dynamic,malloc,allocation,C,Arrays,Dynamic,Malloc,Allocation,即使未使用malloc,阵列是如何创建的 #include <stdio.h> #include <stdlib.h> int main() { int n,i,*ptr,sum=0; printf("Enter number of elements: "); scanf("%d",&n); printf("Enter elements of array: "); for(i=0;i<n;++i) {

即使未使用
malloc
,阵列是如何创建的

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n,i,*ptr,sum=0;
    printf("Enter number of elements: ");
    scanf("%d",&n);
    printf("Enter elements of array: ");

    for(i=0;i<n;++i)
    {
        scanf("%d",ptr+i);
        sum+=*(ptr+i);
    }

    printf("Sum=%d",sum);
    free(ptr);
    return 0;
}
#包括
#包括
int main(){
int n,i,*ptr,和=0;
printf(“输入元素数:”);
scanf(“%d”和“&n”);
printf(“输入数组的元素:”);
对于(i=0;i数组不是“创建的”。它是声明的。然后它不是定义或初始化的。您可以使用它

未定义的行为。

如果使用更严格的编译器,则会得到:

 warning: ‘ptr’ may be used uninitialized in this function [-Wmaybe-uninitialized]
因此,它实际上不是动态的

在我看来,这里更大的问题是
免费(ptr)

有可能,但是也是未定义的行为。由于传递了未初始化的指针,指针的值不清楚。它可能是意外的
NULL
,但不限于此

大局:

访问任何未初始化的变量会导致未定义的行为

编辑:


OP没有声明数组,而是一个整数指针。

如果您在使用指针之前没有
malloc
该指针,它可能不会生成运行时错误,因为您引用的无效地址可能恰好位于您的程序可以访问的空间内,而不会生成访问冲突。这并不意味着它是好的。这是正确的仍然是一个错误。您应该打开警告消息。我很欣赏这个答案,这很有趣,您能否进一步说明--“您引用的无效地址可能恰好位于您的程序可以访问的空间内,而不会产生访问冲突”例如,如果地址在堆所在的区域内,则允许应用程序读取或写入内存,但您可能没有使用
malloc
@CoolGuy正确分配地址。是的,声明了一个整数指针。但OP将其称为数组,这就是我保留它的原因。我将编辑我的答案以删除任何歧义。好。很好。+1顺便说一句。回答得好。