注册 登录
编程论坛 C语言论坛

为什么第二个print函数不能输出

福建刘德华 发布于 2020-02-13 18:24, 2196 次点击
#include<stdio.h>

void main()
{
    char a[]="Evil communication corrupt good manners!",b[40],*p1,*p2,*p3;
    int i;
   
    printf("String a is:%s\n",a);
   
    p1 = a;
    p2 = b;
   
    for( ; *p1 != '\0'; p1++,p2++)
    {
        *p2 = *p1;
    }
        *p2 = '\0';
   
    printf("String a is:%s\n",a);


    printf("String b is:");
   
    for( i=0; b[i] != '\0'; i++)
    {
        printf("%c",b[i]);
    }
   
    putchar('\n');
}
只有本站会员才能查看附件,请 登录
7 回复
#2
福建刘德华2020-02-13 18:36
#3
吹水佬2020-02-13 18:48
溢出
//b[40]
b[41]
#4
叶纤2020-02-13 19:38
程序代码:

你是想让a[]放在b[]里吗
#include<stdio.h>

int main()
{
    char a[100]="Evil communication corrupt good manners!",b[100],p1,p2,p3;
    int i;   
   printf("String a is:%s\n",a);   
    printf("String b is:");
   
    for( i=0; a[i] ; ++i)
    {
        
    b[i]  = a[i];
    printf("%c",b[i]);      
     }
     printf("\n");
  printf("String b is:%s\n",b);   
  printf("String a is:%s\n",a);
    putchar('\n');
}
#5
福建刘德华2020-02-13 21:50
回复 4楼 叶纤
是的
我想知道我这样为什么不能把第二个print函数输出?
蟹蟹!
#6
福建刘德华2020-02-13 21:54
回复 3楼 吹水佬
是的。
但是明明是一样的,为什么不能输出呢?这个b【】数组和a不是没有关系吗?
#7
forever742020-02-13 22:22
不能输出不是必然的,也可能以别的方式出错。

C意义下的字符串是从首地址开始到结束符为止的。
因此首地址单元保存了结束符的就叫空字符串。
某些编译系统喜欢在栈上连续存放你连续定义的变量。
栈的一般实现是逆生长的,也就是从高地址往低地址方向。

那么问题就来了,你的b溢出了以后,放不下的结束符正好被放在了a[0]应该在的位置。
于是a字符串变成了上述的空字符串。
再强调一下,出错是肯定的,但并不一定这样表现。这样表现是偶然的(平台相关)。
#8
福建刘德华2020-02-13 22:25
回复 7楼 forever74
感谢
1