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

  在验证一个字符串翻转算法的时候,出现了一个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\0在常量区,p3在栈上。 
    static int c =0; 全局(静态)初始化区 
     p1 = (char *)malloc(10); 
    p2 = (char *)malloc(20); 
    分配得来得10和20字节的区域就在堆区。 
     strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"
    优化成一个地方。 
} 

 

posted @ 2016-10-19 11:15  麦哈顿博士  阅读(195)  评论(0编辑  收藏  举报