写入位置时发生访问冲突

写入位置时发生访问冲突
原因总结

1:使用了未初始化的指针(未给指针分配空间)

2:使用了已经删除的指针

3.char str[]="ABCD",这个数组的存储空间是在栈中开辟的(在栈中开辟了一个数组?)

char *str="ABCD",str指向的是静态存储区,"ABCD"是位于常量区的,指针str只是指向了这个位置(只在栈中开辟了一个指针内存?),那么这些值就不能被修改。而上面数组中,要注意的是把字符复制到数组的元素中,那么就是可以被任意修改的。

例:

  1. char* str = "ABCD"//char str[] = "ABCD";可以解决  
  2. strrev(str);  
  3. char * strrev(char str[]){  
  4. int j, i;  
  5. for(i = 0, j = strlen(str) - 1; i < j; i++, j--){  
  6. char tmp = str[i];  
  7. str[i] = str[j];//写入位置时发生冲突  
  8. str[j] = tmp;  
  9. }  
  10. return str;  
  11. }  

分析:

程序代码区:

  1.  1 //main.cpp  
  2.  2 int a=0;    //全局初始化区  
  3.  3 char *p1; //全局未初始化区  
  4.  4 main()  
  5.  5 {  
  6.  6     int b;                  //栈  
  7.  7     char s[]="abc";  //栈  
  8.  8     char *p2;           //栈  
  9.  9     char *p3="123456";   //123456\0在常量区,p3在栈上。  
  10. 10     static int c=0;     //全局(静态)初始化区  
  11. 11     p1 = (char*)malloc(10);  
  12. 12     p2 = (char*)malloc(20);   //分配得来得10和20字节的区域就在堆区。  
  13. 13     strcpy(p1,"123456");   //123456\0放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。  
  14. 14 }  

存取效率的比较

char s1[]="aaaaaaaaaaaaaaa";
char *s2="bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;而bbbbbbbbbbb是在编译时就确定的;但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。


原文链接:http://blog.csdn.net/pipisorry/article/details/37055183

ref:用递归实现字符串反转http://blog.csdn.net/andysun1986/article/details/6941230

  • 12
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值