有些人用指针“预测产出”

时间:2010-02-16 04:21:57

标签: c pointers

帮我解决2个关于指针的问题:

1)请告诉我为什么在运行以下代码段时会出现“分段错误”

main()  
{   
    char *str1 = "united";  
    char *str2 ="front";  
    char *str3;  
    str3 = strcat(str1,str2);  
    printf("\n%s",str3);  
}

2)为什么我不能在以下代码中获得输出:

main()  
{  
    char str[10] = {0,0,0,0,0,0,0,0,0,0};  
    char *s; 
    int i;   
    s = str;  
    for(i=0 ; i<=9;i++)  
    {  
        if(*s)  
            printf("%c",*s);
        s++; 
    }   
}

谢谢你。

3 个答案:

答案 0 :(得分:3)

  1. 您应该查看strcat的工作原理。它将尝试在str1指针的末尾重写内存,然后将目标指针返回给您。编译器只在str1中分配了足够的内存来保存“united \ 0”(7个字符),你试图填写“unitedfront \ 0”(12个字符)。 str1仅指向7个已分配的字符,因此无法进行连接。

  2. *s将取消引用s,有效地为您提供数组中的第一个字符。那是0,将评估为假。

答案 1 :(得分:2)

1)编译为:

const char _str1[7] = "united";
const char _str2[6] ="front";
char *str1 = _str1;
char *str2 = _str2;
strcat(str1,str2);
str3 = str1;

str1指向一个长度恰好为7个字节且填充了6个字符的缓冲区。 strcat将另外5个字节放入该缓冲区。 7个字节不能容纳11个字符。 C没有魔法!如果你没有为某些东西明确地分配空间,那么其他任何人都不会这样做......

2)不会打印任何东西。它遍历一个数组,每个元素都为0.然后测试当前项(*s)是否不是0(if(*s)),如果是,则将该项打印为字符。但是,由于该项始终为0,因此始终无法测试。

答案 2 :(得分:1)

对于问题2,请考虑以下几行:

if(*s)