【问题标题】:About initialize array with zero [closed]关于用零初始化数组[关闭]
【发布时间】:2020-11-02 15:34:43
【问题描述】:

错误:{ token 之前的预期表达式

#include <stdio.h>

int main() {
    
    int t;
    scanf("%d",&t);
    
    while(t-->0){
        int m,n,a,b,k;
        int *arr;
        
      scanf("\n%d %d",&n,&m);
     
       arr[n]={ };
     
     
      for(int i=0;i<m;i++){
          
          scanf("\n%d %d %d",&a,&b,&k);
              
    int max=arr[0];
    for(int i=a;i<=b;i++){
        arr[i]=arr[i]+k;
        if(arr[i]>max){
            max=arr[i];
        }
    }
    printf("%d\n",max);
         
      }
      
    }
    return 0;
}

在这段代码中,我将数组初始化为零,但它不起作用,如果我也这样做arr[n]={} 或声明 array global 那么我也得到了错误。

【问题讨论】:

  • 哪一行导致错误?
  • 提供带有行号的实际错误消息说明您使用的编译器
  • @ssd 是的,初始化失败,而不是数组本身。那么现在的问题是什么,你有一个需要初始化为零的 VLA?使用 memset。
  • 我投票结束这个问题,因为最初询问的问题已被所有者从帖子中删除,从而使原始问题、cmets 和答案无效。
  • 我将这个问题回滚到它的原始版本。请发布一个新问题以获得更多帮助。

标签: c token


【解决方案1】:

因为n被定义为一个变量,所以下面的语句有两个问题:

int arr[n]={ };

我的系统状态错误
error: use of GNU empty initializer extension

如果这不是VLA,则可以通过提供初始化程序来解决问题:

#define n 10 //used to size a non-VLA array
...
int arr[n]={0}; //Uses constant array size, not variable,  thus can be initialized normally.

但它 VLA,导致下一个问题,错误使用 VLA,错误状态为:
error: variable-sized object may not be initialized

这两个问题都可以通过以下方式解决:

int arr[n];
memset(arr, 0, sizeof(arr));  

最后一个建议是检查scanf() 语句的返回值:

scanf("\n%d %d",&n,&m);

在假设n之前确保已处理正确数量的项目。

int count = scanf("\n%d %d",&n,&m);
if(count == 2)
{
    int arr[n];
    memset(arr, 0, sizeof(arr);  
    ....

【讨论】:

  • 使用{0} 可以避免“空初始化器”。但是,这只会产生“可变大小的对象可能未初始化”错误!
  • sizeof(int())?
  • @IanAbbott - 哈哈,谢谢! (我希望向你的两个 cmets 发邮件。)
  • .. 或者干脆memset(arr, 0, sizeof arr);
  • @ryyker 在您忘记编辑的最终代码部分中还剩下一个sizeof(int())。有趣的是,GCC 认为 sizeof(int()) 是 1!
【解决方案2】:

arr[n]={ }; 这里是赋值,不是初始化。您正在分配数组中索引 n 处的元素。要初始化一个数组,您需要声明:int array[n];

【讨论】:

  • 但是像 int arr[n]={ };这个我们可以用零初始化数组那么有什么问题?
  • @TheGentelmen24 问题是你没有int arra[n] = {} 而你有arr[n] = {}。这是两个不同的东西。
  • OP 编辑​​了原始代码,导致整个事情成为一个移动的目标。
  • 这解决了问题的原始内容。 +1。 (在问题内容被编辑之前我什至没有出现,所以直到我更仔细地查看你的帖子才知道。)
猜你喜欢
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
相关资源
最近更新 更多