• 因为一个小错误,需要明白一些知识点!


      在验证一个字符串翻转算法的时候,出现了一个bug,这个bug很容易就修改了,但是我觉得还是心理有谱比较好:

    错误代码:

    //字符串翻转函数
    void
    StrReverse(char* str,int start,int end) { char t; while(start<end){ t = str[start]; str[start++] = str[end]; str[end--] = t; } } void main() { char* str = "123456"; //这里定义了一个常量字符串    char str1[] = "123456"; //定义一个局部变量
       char* str2 = (char*)malloc(sizeof(char)*20);//或者在堆申请空间保存变量
      strcpy(str2,str);   StrReverse(strp,
    0,strlen(str)-1);//这里会出错 }

    出错的原因是定义的常量字符串,存储在常量区,而这里的数据是不可变的(也可以透过另外的方法修改),因此翻转函数想通过指针修改常量字符串不成功。可以定义局部变量。或者申请堆空间都可以解决问题。
    但是可以总结一下c语言存储空间的问题(别人总结,这里直接复制):

    1.栈 - 由编译器自动分配释放
    2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
    3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
    4.常量区。- 程序结束释放

    int a = 0; 全局初始化区 
    char *p1; 全局未初始花的变量将保存在BSS段,这个的意思可以理解为(Best save segment),这是从niux演化而来的一个名词 
    main() 
    { 
        int b; 栈 
        char s[] = "abc"; 栈 
        char *p2; 栈 
        char *p3 = "123456"; 123456在常量区,p3在栈上。 
        static int c =0; 全局(静态)初始化区 
         p1 = (char *)malloc(10); 
        p2 = (char *)malloc(20); 
        分配得来得10和20字节的区域就在堆区。 
         strcpy(p1, "123456"); 123456放在常量区,编译器可能会将它与p3所指向的"123456"
        优化成一个地方。 
    } 
    这个只不过是自己的流水账,偶尔有一些心得,错误的地方概不负责
  • 相关阅读:
    P2788 数学1(math1)- 加减算式
    数据库第三章-学习笔记
    字典序
    P1739 表达式括号匹配
    P3742 umi的函数
    P1765 手机
    P2192 HXY玩卡片
    全排函数c++ next_permutation()
    11.css定义下拉菜单
    10.php引用(&)详解及注意事项
  • 原文地址:https://www.cnblogs.com/ashitaka/p/5976525.html
Copyright © 2020-2023  润新知