iOS开发 ----- 关于char *的赋值和字符串之间的复制问题以及sizeof strlen

来源:互联网 发布:传奇盛世心法升级数据 编辑:程序博客网 时间:2024/05/22 17:03

今天来捯饬捯饬关于char*的问题

1 关于数组长度的问题

char a[]={'a','b','c','d','e'};int len=sizeof(a);printf("len = %d\n",len);  //输出5,直接得出数组长度

2,对于数组来说sizeof和strlen的区别

char b[20]="this is a string";int len_b_sizeof=sizeof(b);int len_b_strlen=strlen(b);printf("len_b_sizeof = %d\n",len_b_sizeof);//输出20,sizeof输出的时b分配是的内存大小printf("len_b_strlen= %d\n",len_b_strlen);//输出16,strlen输出的时字符串的长度

3.char *类型的字符的大小

    char *c="s";    printf("c.sizeof = %lu\n",sizeof(c));//输出8,定义一个char *的时候,系统会默认分配8个字节的大小空间    printf("c.strlen = %lu\n",strlen(c));//输出1,其实正真的长度是1

4.不同类型的sizeof,Mac下的情况

    int aa;    char bb[10];    char *cc;    float dd;    printf("sizeof int = %lu\n",sizeof(aa));//4    printf("sizeof char b[] = %lu\n",sizeof(bb));//10    printf("sizeof char *c = %lu\n",sizeof(cc));//8    printf("sizeof float = %lu\n",sizeof(dd));//4

5,数组赋值

    char test[20];    scanf("%s",test);    getchar();    printf("test is %s\n",test);//可以打印出输入的内容

6,数组中间的赋值

    char test2[20];    strcpy(test2,test);    printf("test2 is %s\n",test2);//可以把上边输入的东西,复制到test2中

7,char *类型的赋值

    //情况是这样的,比较特殊,如果在上述5,6存在的情况下,该代码可以运行,但没有的话,是不可以的,(Mac下)    //非常不建议大家这样做,因为这样做的结果就是会导致test3的地址是不确定的,不知道他到底指向哪里    //虽然可以运行,但会非常不安全,而且不小心的话,会爆段错误,segmentation fault    //重要的事要说三遍,不安全,不安全,不安全    char *test3;    printf("char *test3 \n");    scanf("%s",test3);    printf("test3 is %s\n",test3);

这里会爆段错误

这里写图片描述

8.malloc动态分配,更安全的做法

    //这样在输入,或者做字符串中间的拷贝等等是不会报错的,最安全的一种做法    char *str1="sdafadsf";    char *str2=(char *)malloc(sizeof(char *));    char *str3=(char *)malloc(sizeof(char *));    char *str4=(char *)malloc(sizeof(char *));    strcpy(str2,str1);    printf("please input str3 :");    scanf("%s",str3);    getchar();    strcpy(str4,str3);    printf("str1 is %s\n",str1);    printf("str2 is %s\n",str2);    printf("str3 is %s\n",str3);    printf("str4 is %s\n",str4);    free(str2);    free(str3);    free(str4);
0 0
原创粉丝点击