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

本文探讨了iOS开发中char*类型的相关问题,包括数组长度的计算,sizeof与strlen的区别,char*类型字符的大小,不同类型的sizeof在Mac下的表现,以及数组和char*类型的赋值操作。特别强调了不安全的赋值可能导致的段错误,并推荐使用malloc进行动态分配以确保安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天来捯饬捯饬关于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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值