C 意外行为,字符串后出现垃圾打印

C 意外行为,字符串后出现垃圾打印,c,gcc,C,Gcc,我只是试图在终止应用程序之前设置一些字符串的动画。我调用了所附的一段代码来执行此操作。但它一直在打印垃圾,直到核心被丢弃 这是密码 int terminate_msg(int quit_flag) { char server_msg[] = "\nApplication Not Alive"; char exit_msg[] = "\nTerminating Application...\n"; char *ch; int i = 0; if(quit_

我只是试图在终止应用程序之前设置一些字符串的动画。我调用了所附的一段代码来执行此操作。但它一直在打印垃圾,直到核心被丢弃

这是密码

int terminate_msg(int quit_flag)
{
    char server_msg[] = "\nApplication Not Alive";
    char exit_msg[] = "\nTerminating Application...\n";
    char *ch;
    int i = 0;

    if(quit_flag == 1) {
        printf("%s%s", server_msg, exit_msg);
        while((ch = server_msg + i) != NULL) {
            printf("%c",*ch);
            fflush(stdout);
            usleep(100000);
            i++;
        }
        i = 0;
        sleep(2);
        while((ch = exit_msg + i) != NULL) {
            printf("%c",*ch);
            fflush(stdout);
            usleep(100000);
            i++;
        }
        sleep(2);
    }   
    return 0;
}
输出:

Application Not Alive
Terminating Application...

Application Not Alive
Terminating Application...
���І�JS�dX��lX���p�dX��X��$���P
l�UZ��D~�]P�up��IS�@q�P�q�M�dX��І@��!p�\X��^C
虽然first
printf()
打印正确,但我不知道为什么最后会出现垃圾打印。若有任何问题,垃圾应该排在第一位,而循环也应该排在第二位

注意,当比较
*ch!='\0'
,一切正常


这段代码有什么问题?我在linux环境中使用了
gcc

在您的例子中,在一个循环中,递增值为
I
I++;

在每次迭代中指向服务器的下一个内存位置。这里的问题是,无法保证下一个地址(字符串终止后)将是
NULL
。它很可能是通过
NULL
检查的有效内存区域(最有可能是这样的)

所以,您的循环不会中断(正如您所期望的),它将继续执行并(尝试)访问超出绑定的内存区域,这反过来调用。因此,输出和行为也是未定义的


相反,您应该将
*ch
值回复为
\0
,以判断字符串终止。

此条件是错误的

while((ch = server_msg + i) != NULL)
你应该试试这个

char ch;

while ((ch = server_msg[i]) != '\0')
    printf("%c", ch);
条件是测试指针是否为
NULL
,这很可能不会发生,您必须测试的是是否达到了
'\0'
终止字节,因此您需要取消对指针的引用

由于c中的
NULL
基本上是
(void*)0
,如果
server\u msg
是一个有效的指针,那么它的值肯定是
>0
,那么只需增加指针就无法获得
(void*)0
的值,因此循环永远不会结束,在指针传递到它所指向的有效内存后,程序将继续访问指针

当然,同样的问题也发生在这里

while((ch = exit_msg + i) != NULL) {

使用
while(*(ch=server\u msg+i)!='\0'){
while(*(ch=exit\u msg+i)!='\0')){
。顺便说一句,您有一个无限循环,因为
退出标志
未修改。
NULL
是一个描述指向零的指针的宏。它的值作为指针值无效。
NUL
在ASCII表中用于命名代码为0的字符。
'\0'
是一个字符的C编码,该字符带有code 0.0本身就是0值。有很多方法可以定义一个值为0的字符。为什么要使用这个
NULL
宏?[[是的,我在一段时间内得到了它..我做错了什么..我也提到了..*ch!='\0',一切正常。退出消息(第二个while循环)会带来垃圾。关于这方面的任何信息???@Aman您是否将检查更改为“*ch!=”\0“,”在
exit\u msg
”中,并检查“ch值”在这两个循环中,一切都正常。但仅在退出消息中检查
*ch!='\0'
仍然是打印垃圾。@Aman显然,首先while会给UB然后。一旦UB,UB永远。:-)
while((ch = exit_msg + i) != NULL) {