对于循环赋值溢出到另一个变量

时间:2014-07-22 00:35:20

标签: c arrays sizeof

我正在尝试使用for循环为C中的数组赋值(我使用minGW)。起初我尝试过:

double flag[5] = {0.1};

但是只将数组中的第一个变量赋值为0.1。然后我尝试做一个for循环来单独分配每个。我之所以不想硬编码,是因为我希望flag变量的大小对用户的输入是灵活的。我目前的代码如下:

    int cnt;
    double flag[5];
    for (cnt = 0; cnt < sizeof(flag); cnt++) {
        printf("sizeof(flag) is %d\n",sizeof(flag));
        printf("size is equal to %d and cnt is %d\n",size,cnt);
        flag[cnt] = 0.1;
    }
    printf("size is equal to %d\n",size);

变量"size"从之前确定的变为6变为垃圾数,我无法修改迭代次数。例如,如果我设置cnt < sizeof(flag)-1,则没有变化。 -2,-5,等没有变化。但是,如果我大幅减小尺寸,它会陷入无限循环。 sizeof(flag)是40,而不是像我想要的那样,但是除以8也会以某种方式将其变为无限循环。有什么建议吗?

这个问题得到了回答,谢谢大家!

4 个答案:

答案 0 :(得分:4)

flag数组的元素数量不是:

sizeof (flag)

sizeof flag / sizeof *flag

前者是数组的字节大小,后者是数组的字节大小除以数组中一个元素的字节大小。

答案 1 :(得分:3)

改变:

for (cnt = 0; cnt < sizeof(flag); cnt++) 

for (cnt = 0; cnt < sizeof(flag)/sizeof(double); cnt++) 

答案 2 :(得分:1)

使用

    for (cnt = 0; cnt < sizeof flag / sizeof *flag; cnt++)
{

}

答案 3 :(得分:1)

sizeof()返回该变量5*sizeof(double)所需的字节数。所以你的循环运行超过5次导致溢出。

除了前面答案中建议的解决方案之外,你可以有一个宏的数组大小,并使用这个宏并运行循环,直到该值。

 #define SIZE 5
 .
 .
 .
 int cnt;
 double flag[SIZE];
 for (cnt = 0; cnt < SIZE; cnt++) {
      printf("sizeof(flag) is %d\n",sizeof(flag));
      printf("size is equal to %d and cnt is %d\n",size,cnt);
      flag[cnt] = 0.1;
 }
 printf("size is equal to %d\n",size);