因为一个小错误,需要明白一些知识点!
在验证一个字符串翻转算法的时候,出现了一个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" 优化成一个地方。 }
这个只不过是自己的流水账,偶尔有一些心得,错误的地方概不负责