c中可变大小对象的初始化问题

时间:2014-03-15 15:51:40

标签: c initialization

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

#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 object备忘录&#39;可能没有初始化。

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

2 个答案:

答案 0 :(得分:3)

这不会编译:

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写入sizeof(int)的每个memo[i]个字节中。但由于-1通常由填充了1的位模式表示,因此它仍然可以工作。如果-1由不同的位模式表示,那么您可能会感到意外。就个人而言,我会进行手动初始化。

答案 1 :(得分:1)

根据C标准

  

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