C 中的 Sleep 函数使程序打印出奇怪的字符
Function Sleep in C makes the programs prints strange characters
[编辑]我用 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;
}
因为程序执行速度太快,我进入了函数Sleep,但是现在,当我编译它时,它在"wave"附近打印出奇怪的字符。
谢谢你。
对不起我的英语不好,我是意大利人。
当您修改 riga_disegno
超出其边界时,您的代码会调用未定义的行为。您访问和修改 riga_disegno[-1]
和 riga_disegno[10]
。如前所述,未定义的行为 意味着任何事情都可能发生,包括预期的行为。
在您的特定情况下,您想知道为什么当您通过添加函数调用修改代码时行为会发生变化 Sleep()
。一个可能的解释是编译器在您修改源代码时生成不同的代码,尤其是在您调用外部函数时。超出数组边界修改内存的副作用可能不同,因为数组 riga_disegno
本身或其他局部变量 i
和 j
可能分配不同。如果没有调用,副作用可能不会影响程序的输出,导致您错误地认为一切正常。通过调用,您可以看到这种未定义行为的一些副作用。
这很好地说明了为什么应该始终避免未定义的行为。即使程序看起来运行正常,最细微的修改也会带来灾难性的后果。
[编辑]我用 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;
}
因为程序执行速度太快,我进入了函数Sleep,但是现在,当我编译它时,它在"wave"附近打印出奇怪的字符。 谢谢你。 对不起我的英语不好,我是意大利人。
当您修改 riga_disegno
超出其边界时,您的代码会调用未定义的行为。您访问和修改 riga_disegno[-1]
和 riga_disegno[10]
。如前所述,未定义的行为 意味着任何事情都可能发生,包括预期的行为。
在您的特定情况下,您想知道为什么当您通过添加函数调用修改代码时行为会发生变化 Sleep()
。一个可能的解释是编译器在您修改源代码时生成不同的代码,尤其是在您调用外部函数时。超出数组边界修改内存的副作用可能不同,因为数组 riga_disegno
本身或其他局部变量 i
和 j
可能分配不同。如果没有调用,副作用可能不会影响程序的输出,导致您错误地认为一切正常。通过调用,您可以看到这种未定义行为的一些副作用。
这很好地说明了为什么应该始终避免未定义的行为。即使程序看起来运行正常,最细微的修改也会带来灾难性的后果。