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

今天来捯饬捯饬关于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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章