- 此问题在此处已有答案**:
(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。
2条答案
按热度按时间gmxoilav1#
答案一:
如果没有,那是因为你有未定义的行为。
未定义的行为是由访问数组外部引起的。
在
i
为-5,-4,-3,-2,-1的情况下,array[i] = i + 3;
会发生这种情况。答案二:
这个答案并不是真正的答案,因为在存在未定义行为的情况下,所有的解释都是没有意义的。
然而,在编译器和运行时环境在未定义行为(基本上是所有......)的情况下允许做的所有坏事中,有可能是以下这些:
for ( i = -5; i < 20; i++)
确实从-5计数到19array[i] = i + 3;
首先在数组之前访问(导致未定义的行为),随后在数组内访问,并将值写入非法存储器位置(即,不应写入的位置),然后将比计数器i
高3的一些值写入数组3,4,5,6,7,8,9,10,11,12
w7t8yxp52#
一些问题...
1.在您的示例中,如果
i
的起始值为-5
,则写入array[i]
是试图在main
中的数组开始 * 之前 * 写入。这是UB(未定义行为)1.您要将数组值设置为
i + 3
。1.这 * 不 * 递增/计数3。
1.我们要使用
i
和 * 增量 * 31.在
main
中,数组有9个元素,但我们传递的是10作为计数。1.该函数并不检查数组索引与计数的关系,因此它依赖于值的限制是否会防止溢出。
因此,请更改:
转入:
下面是更正后的代码。它带有注解:
在上面的代码中,我使用了
cpp
条件来表示旧代码和新代码:注意:通过
unifdef -k
运行文件可以清除此问题