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 本身或其他局部变量 ij 可能分配不同。如果没有调用,副作用可能不会影响程序的输出,导致您错误地认为一切正常。通过调用,您可以看到这种未定义行为的一些副作用。

这很好地说明了为什么应该始终避免未定义的行为。即使程序看起来运行正常,最细微的修改也会带来灾难性的后果。