【学习ios之路:C语言】字符串溢出情况分析.

本文探讨了在iOS开发中学习C语言时遇到的字符串溢出问题,通过代码示例分析了如何在str2向str3赋值过程中由于str2的溢出导致的异常情况。

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

    代码分析:代码如下:

    char s[5] = "phone";//这个空间大小为5 ,字符串隐藏\0,作为字符串的结束标志.
    char str2[10], str3[10] ; //定义 str2,str3,两个字符数组,空间大小为10, 默认有隐藏字符\0;
    for (int i =0; i< 10; i++) {
        str2[i] = 'a'; //将字符'a'遍历10次,保存到str2中,赋值结束,出现溢出现象,\0被溢出,即,没有结束标志.
        printf("%c ", str2[i]);
    }
    strcpy(str3, str2);
    printf("str3 = %s\n",str3); //结果aaaaaaaaaaphone
    printf("str2 = %s\n",str2);  //结果phone

 

     分析如下:

          str2 和 str3 出现此结果的情况 :str2内的值赋值为str3,因为str2溢出,,

                        数组内存开辟空间是从高地址到底地址存储. 即由高到低的存储顺序为  s -> str2 -> str3
                        但给对应字符数组空间赋值,是从低到高,进行赋值,所以,当开始赋值结果如下:
                        值域,即空间大小     111111111.. ----------------------------------------------   0
                        3个字符串存储对应空间位置 :    (enohp)(0/xxxxxxxx)(0/xxxxxxxxx)   //括号为了方便区分. \0,即每个字符串都隐藏结束标志. X代表存储空间无值.
                                              对应字符数组:         -s-          ---str2---      ---str3---
     
          第一步 : 将10个字符'a'遍历存入到字符数组str2中,分析:因为空间本身大小为10,如果讲10个'a'存储进去,就会造成溢出,即对应字符数组中将没有\0,即没有字符串结束标志.存储结果如下:
                      3个字符串存储对应空间位置 :    (enohp)(aaaaaaaaaa)(0/xxxxxxxxx)   //括号为了方便区分. \0,即每个字符串都隐藏结束标志. X代表存储空间无值.
                                             对应字符数组:        -s-         ---str2---          ---str3---
         第二步 :  strcpy(str3,str2); 即将 str2中的字符串,复制到对对应的字符数组str3中,分析:
                     1. 因为str3字符数组空间大小为10,即当把str中得元素复制到str3中,也将会存在溢出,而且存储后无\0.
                     2. 将str2中的值复制给str3,但因为 str2和字符数组s之间都没有结束标志,所以对应值会不断的将后序值替换,及相当于像右平移).
                     3.因为没有\0结束标志,所以复制过程不结束,知道出现 \0,结束标志.结果如下:
                    
                  字符串存储对应空间位置 :   (知道出现\0)....xxxxxxx(xxxxx)(enohp)(aaaaaaaaaa)   //括号为了方便区分. \0,即每个字符串都隐藏结束标志. X代表存储空间无值.
                                                                      对应字符数组:         -s-      -str2-      ---str3---
                     即" str3 = aaaaaaaaaaphone;
                          str2 = phone ;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值