像这样初始化可变大小的对象有什么问题?
#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()。 有人可以帮我吗.. 感谢..
答案 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要初始化的实体的类型应为数组 未知大小或不是可变长度的完整对象类型 数组类型。