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
虽然firstprintf()
打印正确,但我不知道为什么最后会出现垃圾打印。若有任何问题,垃圾应该排在第一位,而循环也应该排在第二位
注意,当比较*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) {