【问题标题】:Isuue with the initialization of variable sized object in c在 c 中初始化可变大小对象的问题
【发布时间】:2014-03-15 15:51:39
【问题描述】:

这样初始化可变大小的对象有什么问题?

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

    int fun(int n,int *dp)
{
    dp[1]=0;

    int i;
    for(i=2;i<=n;i++)
    {
        dp[i]=1+dp[i-1];
        if(i%2==0)dp[i]=min(dp[i],1+dp[i/2]);
        if(i%3==0)dp[i]=min(dp[i],1+dp[i/3]);
    }
    return dp[n];
}


    int main()
    {
        int arr[4]={2,4,1,7};
        int i;
        for(i=0;i<4;i++)
        {
            int memo[arr[i]+1]={-1};
            //memset(memo,-1,sizeof(memo));
            int result=fun(arr[i],memo);
            printf("%d\t",result);
        }
    return 0;
    }

错误是:variable-sized objectmemo'可能未初始化`

最初我尝试使用这种初始化方法。但后来使用了 memset()。 有人可以帮我吗.. 谢谢..

【问题讨论】:

  • 然后发生了什么?错误?
  • 什么是备忘录?请粘贴完整的真实代码
  • 可变长度数组不能有初始化器。
  • @lizusek memo 是什么,已经存在了。
  • @m0skit0 错了,在这里查看问题的第一个修订版:stackoverflow.com/revisions/22426045/1memo 的声明一直存在

标签: c initialization


【解决方案1】:

这不会编译:

int memo[arr[i]+1]={-1};

在可变长度数组中不能有初始化列表。您必须手动初始化它:

    int memo[arr[i]+1];
    for (int j = 0; j < arr[i]+1; j++)
        memo[j] = -1;
    int result=fun(arr[i],memo);
    printf("%d\t",result);

至于memset 解决方案,它应该 工作,假设使用 2 补码 - 这是因为 memset 逐字节工作,所以它实际上是写入字节 -1 几个次写入memo[i] 的每个字节(特别是,它会将-1 写入memo[i] 的每个sizeof(int) 字节)。但由于-1 通常由填充 1 的位模式表示,因此它仍然可以工作。如果-1 由不同的位模式表示,那么您可能会感到惊讶。就个人而言,我会选择手动初始化。

【讨论】:

  • 您忘记删除示例中的初始化程序;)。
  • @Ismael 哎呀。已编辑。谢谢:)
【解决方案2】:

根据 C 标准

3 要初始化的实体的类型应该是一个数组 未知大小或不是可变长度的完整对象类型 数组类型。

【讨论】:

  • 这是编译错误吗?这是因为初始数组 arr[] 的初始化发生在运行时而不是编译时?
猜你喜欢
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多