函数Sleep in C使程序打印奇怪的字符

时间:2015-04-12 10:06:39

标签: c sleep nested-loops

[编辑]我在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”附近打印奇怪的字符。 谢谢。 抱歉我的英语不好,我是意大利人。

1 个答案:

答案 0 :(得分:3)

当您修改超出其边界的riga_disegno时,您的代码会调用未定义的行为。您可以访问和修改riga_disegno[-1]riga_disegno[10]。如上所述,未定义的行为意味着任何事情都可能发生,包括预期的行为。

在您的特定情况下,您想知道为什么在通过添加函数调用Sleep()来修改代码时行为会发生变化。可能的解释是编译器在修改源代码时会生成不同的代码,尤其是在调用外部函数时。修改内存超出数组边界的副作用可能会有所不同,因为数组riga_disegno本身或其他局部变量ij可能会有不同的分配。没有通话,副作用可能不会影响程序的输出,导致您错误地认为一切正常。通过调用,您可以看到这种未定义行为的一些副作用。

这是一个很好的说明,为什么一个人应该总是避免未定义的行为。即使该程序似乎运行正常,但最轻微的修改可能会产生灾难性的后果。