可变大小数组和指针之间的区别? [复制]

Posted

技术标签:

【中文标题】可变大小数组和指针之间的区别? [复制]【英文标题】:Difference between variable sized array and pointer? [duplicate] 【发布时间】:2019-10-05 06:57:03 【问题描述】:

以下两种说法有什么区别?

i) long long int ar[n+1];

ii) long long int *ar=new long long int[n+1]();

对于hackerrank中的数组操作问题,我的代码在使用第一个语句时失败了一些测试用例,但在第二个语句中得到了正确的答案。

int main()

    long long int n,m,a,b,k,i,x=0,maxi=INT_MIN;
    cin>>n>>m;
    //long long int ar[n+1];
    long long int *ar=new long long int[n+1]();
    while(m--) 
        cin>>a>>b>>k;
        ar[a]+=k;
        if((b+1)<=(n))
        ar[b+1]-=k;
    
    for(i=1;i<=n;i++) 
       x=x+ar[i];
       if(maxi<x) 
       maxi=x;
    
    cout<<maxi;
    return 0;

【问题讨论】:

区别:首先是格式不正确,其次是格式正确(但不推荐)。 您的第一次尝试没有初始化数组元素,当您稍后使用它们的不确定值时会导致未定义的行为。 【参考方案1】:

i) long long int ar[n+1];

这仅在编译时知道n 时有效,而您的情况并非如此。它可能会因为某些编译器的扩展而编译。

如果n 在编译时已知并且您有一个有效的代码ar 将被分配到自动内存中。

ii) long long int *ar=new long long int[n+1];

ar 这里将被分配在动态内存中,n 几乎没有限制,你必须自己照顾它的生命。

每个new 都应该带有一个delete

【讨论】:

以上是关于可变大小数组和指针之间的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将可变大小的 void 指针存储在一个指针数组中?

在 C 中初始化指针数组 - 可变大小的对象可能未初始化

指向指针数组和指针数组的指针之间的区别[重复]

取消引用指针和访问数组元素之间的区别

指针数组 (*A)[] 和双指针 **A 之间的区别

指针和数组之间的区别[重复]