for循环应该是无限的,因为我已经为其分配了NULL'\ 0'。

/* a program to copy string str1 to str2 without using string handling function*/
#include<stdio.h>
void main()
{
    char str1[50],str2[50],ch;
    int i;
    printf("Enter String1:");
    gets(str1);
    for(i=0; str1[i]>='\0'; i++)
    {
        str2[i]=str1[i];
    }
    printf("String1 : %s\nString2 : %s\n", str1, str2);
    getch();
}

最佳答案

此检查:str1 [i]> ='\ 0'是带符号的比较。一旦访问了超出str1边界的未初始化数据,您最终将访问一个值> 127的字节,该值在有符号比较中使用时为负,因此小于零('\ 0'),因此循环终止。程序可能还会遇到访问冲突并在遇到负字节之前崩溃-它仅取决于内存中的内容,但是如果程序没有崩溃,则程序将破坏str2之后的内存。

此代码不安全,并且是缓冲区溢出如何发生的示例。终止循环的正确检查是“ str1 [I]!='\ 0'”。

关于c - 该程序是如何工作的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22430809/

10-12 15:02