为什么这个C循环不是从-5数到19?[duplicate]

8wtpewkr  于 2022-12-22  发布在  其他
关注(0)|答案(2)|浏览(107)
    • 此问题在此处已有答案**:

(9个答案)
2天前关闭。
我不知道为什么我的程序不能从-5数到19。有人能给我一个提示吗?非常感谢!

int printArray(int array[], int count){
    for ( i = 0; i < count; i++)
    {
        printf("%d ", array[i]);
    }
    printf("\n");
}
int aufgabe4(int array[], int count){
    
    for ( i = -5; i < 20; i++)
    {
        array[i] = i + 3;
    }
    

}
int main (void){
printf("4.Aufgabe\n");
    int data3[9] = {0};
    aufgabe4(data3, 10);
    printArray(&data3[0], 10);
}

预期输出应该是-5 -2 1 4 7 10 13 16 19 be但是shell给我3 4 5 6 7 8 9 10 11 12,我真的不知道哪里错了,因为我计算的是i +3。

gmxoilav

gmxoilav1#

答案一:
如果没有,那是因为你有未定义的行为。
未定义的行为是由访问数组外部引起的。
i为-5,-4,-3,-2,-1的情况下,array[i] = i + 3;会发生这种情况。
答案二:
这个答案并不是真正的答案,因为在存在未定义行为的情况下,所有的解释都是没有意义的。
然而,在编译器和运行时环境在未定义行为(基本上是所有......)的情况下允许做的所有坏事中,有可能是以下这些:

  • 此循环for ( i = -5; i < 20; i++)确实从-5计数到19
  • 该循环内的该行array[i] = i + 3;首先在数组之前访问(导致未定义的行为),随后在数组内访问,并将值写入非法存储器位置(即,不应写入的位置),然后将比计数器i高3的一些值写入数组
  • 稍后,您打印从索引0到索引9的这些值,并得到它们的输出,每个值比相应的索引高三倍,即您观察到的值

3,4,5,6,7,8,9,10,11,12

w7t8yxp5

w7t8yxp52#

一些问题...
1.在您的示例中,如果i的起始值为-5,则写入array[i]是试图在main中的数组开始 * 之前 * 写入。这是UB(未定义行为)
1.您要将数组值设置为i + 3
1.这 * 不 * 递增/计数3。
1.我们要使用i和 * 增量 * 3
1.在main中,数组有9个元素,但我们传递的是10作为计数。
1.该函数并不检查数组索引与计数的关系,因此它依赖于值的限制是否会防止溢出。
因此,请更改:

for (i = -5; i < 20; i++) {
    array[i] = i + 3;
}

转入:

for (int i = 0, j = -5; i < count; i++, j += 3)
    array[i] = j;

下面是更正后的代码。它带有注解:

#include <stdio.h>

int
printArray(int array[], int count)
{
    for (int i = 0; i < count; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
}

int
aufgabe4(int array[], int count)
{

// NOTE/BUG: this is indexing _before_ the start of the array so this is
// UB (undefined behavior)
// NOTE/BUG: we don't want "i + 3" -- we want to increment by 3
#if 0
    for (int i = -5; i < 20; i++) {
        array[i] = i + 3;
    }
#else
    for (int i = 0, j = -5; i < count; ++i, j += 3) {
        array[i] = j;
    }
#endif
}

int
main(void)
{
    printf("4.Aufgabe\n");

// NOTE/BUG: too small for passed count value
#if 0
    int data3[9] = { 0 };
#else
    int data3[10] = { 0 };
#endif

    aufgabe4(data3, 10);

    printArray(&data3[0], 10);

    return 0;
}

在上面的代码中,我使用了cpp条件来表示旧代码和新代码:

#if 0
// old code
#else
// new code
#endif

#if 1
// new code
#endif

注意:通过unifdef -k运行文件可以清除此问题

相关问题