【问题标题】:Initializing a variable length array to zero [duplicate]将可变长度数组初始化为零[重复]
【发布时间】:2014-07-25 21:25:49
【问题描述】:
int x = 750;
int i = 0;

while (pow(2, i) < x) {
    i++;
}
printf("i is currently %d\n", i);

int array[i];

while (i > 0){
    i--;
    printf("The value of array %d is %d\n", i, array[i]);
}

当我这样做时,它创造了一些非常疯狂的价值。我听说过尝试使用 malloc 或 memset,但值没有改变。我要做的就是将所有这些设置为零,以便我可以将其用作计数器。谢谢!

【问题讨论】:

  • 什么,确切地,当值“没有改变”时,memset 您尝试看起来像吗?请张贴那个。我的水晶球告诉我你调用了memset(array, 0, i),你应该调用memset(array, 0, i*sizeof(*array));
  • 嘿,谢谢 Craig,这是真的,我什至没有意识到。我需要修改它。好的,我也尝试了memset(array, 1, i*sizeof(*array));,它显示所有值为 16843009
  • 你想要它们一还是零?记住,memset 设置 octets;不是实体。将 4 字节整数序列中的每个 byte 设置为 1 会为每个 int 提供 0x01010101 ,转换为十进制是 16843009。如果您希望它们全部为初始值1 你需要通过硬循环来完成。 for (int j=0; j&lt;i; array[j++] = 1); 或类似的东西。
  • 最后的 for 循环正是我所需要的。我没有意识到我可以把array[j++] 贴在柜台上。非常感谢,这非常有帮助!
  • 只要你解决了这个问题,你也可以解决你计算 i 的昂贵方式。试试while ((1 &lt;&lt; i++) &lt; x);。如果 x 是 1,您拥有的版本将允许 i 将循环转义为零。那将是bad,因为它会导致一个无用的VLA。对于这一切,我也会鼓励unsigned int

标签: c initialization variable-length-array


【解决方案1】:

您没有初始化数组值。它的内容是垃圾:printf 中的 array[i] 的值没有定义 - 它可能是任何东西。

要将数组初始化为 0,您可以使用 memset(正如 @WhozCraig 评论的那样,memset 正在将数组的所有字节设置为给定值):

memset (array, 0, sizeof(array));

要写别的,写一个for循环:

 int n = 0;
 for(; n < i ; ++n)
    array[n] = n; 

【讨论】:

  • 为了完整起见,初始化为0,int array[i] = { 0 };简洁无敌。
  • @Pascal,OP 数组是动态调整大小的。 “错误:可变大小的对象可能未初始化”
猜你喜欢
  • 2013-06-24
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 2013-09-22
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多