提交回答
  • 至过去的我

    2044人对此回答表示赞同

    我是未来的你,你现在是不是在年找寻小程序答案。你不要感觉诧异,给你来信原因,就是让你不在后悔。今天去学习如何推广小程序,相信......点击查看更多>
    发布于
  • 货真价实冰麒麟

    16人对此回答表示赞同

    为初始化定义,系统随机分配
    展开
    16
    0回复
    发布于 7年前

    评论(0)

    收起评论

  • Keyanna Lee

    16人对此回答表示赞同


    对于这个问题你要了解C语言中字符串的存储方式。C语言中的字符串也叫做C风格字符串,其实在C++中我们就很少使用C风格的字符串了,因为C风格字符串常常带来许多错误,是导致大量安全问题的根源。

    C中字符串类型,从字面上来理解就是char字符型数组,但这并不准确!因为C风格字符串是以空字符null结束的字符数组,注意了,这里是null,即'',不是空格,也不是换行符,新手经常在这里出现错误!了解了储存之后,再来看一下C风格字符串的输出:C风格字符串的输出方式为从第一个字符往后输出直到遇到空字符''。其实这也是导致安全问题的根本原因,因为如果因为数组越界,或者赋值时遗漏等原因导致''丢失,这个时候输出字符串会访问到其他变量的内存甚至垃圾内存。

    你这里

    char b[3];

    char c[6];是定义在结构体中的,结构体在内存中的储存也是连续的,所以这里b与c的内存是靠在一起的,而且先定义的在低位,后定义的在高位,这里输入d.b="123"之后D.b中实际储存情况是

    d.b[0] = '1';

    d.b[1] = '2';

    d.b[2] = '3';注意这里,b的大小是3个字节,输入123之后它必须在末尾加上空字符'',数组使用越界了!这个时候''到底加了没有,加到哪去了?答案是加到d.c上去了,因为b与c的内存是连续的,而编译器本身并不会做越界检查,他只会根据你给的地址往后存放,所以这里的''放在了b最后一个元素后面,恰好也是c的第一个元素。那么为什么输出b的时候会连着输出c呢,因为之后你输入c之后把c的第一个元素''覆盖了,这个时候输出b的结果就是输出b中储存的三个字符,再输出c中的字符知道遇到c的结束符'';如果c中也丢失了''将会访问到后续的内存,可能导致程序崩溃。


    在C++ 中解决很简单,使用string即可,而在C中,我们通常采取的方法有两个,第一种就是分析数据,确定数据的最长长度,以最长长度定义数组。第二种便是使用动态数组,如下:

    #include <stdio.h>
    #include <string.h>
    #include<stdlib.h>
    struct a
    {
        char* b;
        char* c;
    };
    int main(int argc, char *argv[])
    {
        struct a d;
        d.b = (char *) malloc(10 * sizeof(char));
        memset(d.b, 0, 10);
        printf ( "Please input d.b: " );
        gets(d.b);
        printf ( "Please input d.c: " );
        d.c = (char *) malloc(10 * sizeof(char));
        memset(d.c, 0, 10);
        gets(d.c);
        puts("----------------------");
        printf("the d.b is: %s ", d.b);
        printf("the d.c is: %s ", d.c);



        struct a p;
    char data[100];

        printf ( "Please input p.b: " );
        
    展开
    16
    0回复
    发布于 7年前

    评论(0)

    收起评论

  • 想回火星的怪力少女

    16人对此回答表示赞同

    因为在内存里面b[3]和c[6]是连在一起的,当你b充满了的时候,\0就没了,也就是说b和c完全的连在了一起,当读b的时候会把c也一起读了出来,解决方法有两种,一种是把b加大,一种是把它们定义为string类型
    求采纳
    展开
    16
    0回复
    发布于 7年前

    评论(0)

    收起评论

  • Angel

    16人对此回答表示赞同

    d.b的存储空间你定义为b[3],只有三个字符,但是字符串的最后一个要求存入‘\0’,作为字符串的结束符。 你输入d.b为123 超出两个字符,故‘\0’被放在结构a的下一个元素的开始位置(这是由于结构的存储结构造成的)。所以两个字符串就串成一个字符。 后一个字符串却不受影响。

    定义字符串,记住一定要比你要求的长度+1 !
    展开
    16
    0回复
    发布于 8年前

    评论(0)

    收起评论

  • 伯兰

    16人对此回答表示赞同

    对于结构变量d,其成员b和c在内存中是连续占用空间的
    当输入出123时,其结尾符\0是处在c的首址,所以当再输
    入456789时,字符'4'将原来的\0冲掉,这样对于a来说,就是
    "123456789\0"。
    这很容易验证:只要在输入第一个字符串时不要超过2个字符,就可以了.
    如输入“12”,就不会出现这种现象
    展开
    16
    0回复
    发布于 8年前

    评论(0)

    收起评论

  • Daniel

    16人对此回答表示赞同

    o,我明白为什么系统提示不让用gets了
    #include <stdio.h>
    #include <string.h>
    struct a
    {
    char b[3];
    char c[6];
    };
    int main(int argc, char *argv[])
    {
    struct a d;
    int i;
    char ch;
    printf ( "Please input d.b:\n" );
    i=0;
    while((ch=getchar())!='\n'&&i<2)//按需读入字符
    {
    d.b[i]=ch;
    i++;
    }
    d.b[i]='\0';
    while(getchar()!='\n')//清空输入缓存
    continue;
    printf ( "Please input d.c:\n" );
    i=0;
    while((ch=getchar())!='\n'&&i<5)
    {
    d.c[i]=ch;
    i++;
    }
    d.c[i]='\0';
    puts("----------------------");
    printf("the d.b is: %s\n", d.b);
    printf("the d.c is: %s\n", d.c);
    return 0;
    }
    展开
    16
    0回复
    发布于 9年前

    评论(0)

    收起评论

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
咨询热线

13312967497

扫码添加业务即可随时咨询 还可领取小程序推广攻略

业务咨询: 13312967497
扫码咨询

扫码咨询套餐

回到顶部