因为循环卡在C(cygwin)的函数调用中,非常奇怪的行为我无法理解

Gle*_*ner 2 c loops for-loop

我有这个功能someoneDidSomething(),它意味着产生一个像"曼迪爱耶稣!"这样的随机短语.例如.

问题是,当我只调用它一次并退出程序时,它工作得很好.即使我反复拨打该程序几次.但是当我在循环中调用它时,输出看起来像下面的图像.

PS:过了一段时间我得到了一个分段错误.

我很困惑:D - 这没有任何意义.

void main ()
{
    for (int i = 0; i <= 500; i++)
    {
        char message[255];
        strcpy (message, someoneDidSomething());
        printf ("Because %s\n", message);
        sleep (1);
    }
}

char* someoneDidSomething()
{
    static char message[255];
    strcat (message, getPerson());
    strcat (message, " ");
    strcat (message, getVerb());
    strcat (message, " ");
    strcat (message, getSomething());
    strcat (message, ".");
    return message;
}
Run Code Online (Sandbox Code Playgroud)

称为一次输出:

Because Mandy loved Jesus.
Run Code Online (Sandbox Code Playgroud)

在for循环中调用:

Because Mandy loved Jesus.Hammond felt the World.Ashlynn knew Jesus.
Run Code Online (Sandbox Code Playgroud)

Jea*_*bre 5

这里:

static char message[255];
strcat (message, getPerson());
Run Code Online (Sandbox Code Playgroud)

它是第一次工作,因为全局内存(static在大多数系统中归零,虽然添加一个= {0};没有伤害),所以strcat行为就像strcpy.

但随后的电话会保留价值message.message增长和增长,所以不是你想要的结果,一段时间后,缓冲区溢出会触发分段错误.

你需要strcpy第一步.

static char message[255];
strcpy (message, getPerson());
Run Code Online (Sandbox Code Playgroud)

由于您在调用者中复制结果,为什么不直接传递缓冲区:

    char message[255];
    someoneDidSomething(message);
Run Code Online (Sandbox Code Playgroud)

然后你的例程开始于:

void someoneDidSomething(char *message)
{
    strcpy(message, getPerson());
Run Code Online (Sandbox Code Playgroud)

你也可以考虑单个sprintf而不是所有那些函数调用......

并且不返回任何东西(不需要).还允许在多线程环境中安全地调用您的方法(如果结果字符串的长度不超过缓冲区的长度,则是安全的,永恒的问题)