[编辑]我在C中编写了一个程序,它应该通过打印和连续修改矢量“riga_disegno”来打印垂直波。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int riga_disegno[10], i = 0, j = 0, k = 0, length = 0;
for(i = 0; i < 10; i++) /* Inizializza il vettore */
{
riga_disegno[i] = 177;
}
printf("Quanti periodi dell'onda vuoi stampare?");
scanf("%d", &length);
for(k = 0; k < length; k++)
{
for(j = 0; j < 10; j++) /* Assegna ad un componente vettore il disegno dell'onda */
{
riga_disegno[j] = 254;
for(i=0; i < 10; i++)
{
putchar(riga_disegno[i]); /* stampa il carattere [i] del vettore*/
}
printf("\n");
riga_disegno[j] = 177; /* Riporta il componente al carattere di base */
Sleep(100);
}
for(j = 9; j >= 0; j--) /* Assegna ad un componente vettore il disegno dell'onda */
{
riga_disegno[j] = 254;
for(i=0; i < 10; i++)
{
putchar(riga_disegno[i]);
}
printf("\n");
riga_disegno[j] = 177; /* Riporta il componente al carattere di base */
Sleep(100);
}
}
return 0;
}
我进入了睡眠功能,因为程序的执行速度太快,但是现在,当我编译它时会在“wave”附近打印奇怪的字符。 谢谢。 抱歉我的英语不好,我是意大利人。
答案 0 :(得分:3)
当您修改超出其边界的riga_disegno
时,您的代码会调用未定义的行为。您可以访问和修改riga_disegno[-1]
和riga_disegno[10]
。如上所述,未定义的行为意味着任何事情都可能发生,包括预期的行为。
在您的特定情况下,您想知道为什么在通过添加函数调用Sleep()
来修改代码时行为会发生变化。可能的解释是编译器在修改源代码时会生成不同的代码,尤其是在调用外部函数时。修改内存超出数组边界的副作用可能会有所不同,因为数组riga_disegno
本身或其他局部变量i
和j
可能会有不同的分配。没有通话,副作用可能不会影响程序的输出,导致您错误地认为一切正常。通过调用,您可以看到这种未定义行为的一些副作用。
这是一个很好的说明,为什么一个人应该总是避免未定义的行为。即使该程序似乎运行正常,但最轻微的修改可能会产生灾难性的后果。