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