zoukankan      html  css  js  c++  java
  • 写入位置时发生訪问冲突

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

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

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

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

    char *str="ABCD"。str指向的是静态存储区,"ABCD"是位于常量区的,指针str仅仅是指向了这个位置(仅仅在栈中开辟了一个指针内存?),那么这些值就不能被改动。

    而上面数组中,要注意的是把字符拷贝到数组的元素中。那么就是能够被随意改动的。

    例:

    char* str = "ABCD"; //char str[] = "ABCD";能够解决
    strrev(str);
    char * strrev(char str[]){
    int j, i;
    for(i = 0, j = strlen(str) - 1; i < j; i++, j--){
    char tmp = str[i];
    str[i] = str[j];//写入位置时发生冲突
    str[j] = tmp;
    }
    return str;
    }

    分析:

    程序代码区:

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

    存取效率的比較

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


    from:http://blog.csdn.net/pipisorry/article/details/37055183

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

  • 相关阅读:
    SQLServer多表连接查询
    SQLServer基本查询
    SQLServer索引
    SQLServer之数据类型
    设计模式小结
    SQL跨项目查询语法
    利用CountDownLatch和Semaphore测试案例
    JUC包下Semaphore学习笔记
    JUC包下CountDownLatch学习笔记
    JUC包下CyclicBarrier学习笔记
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5336483.html
Copyright © 2011-2022 走看看