写入位置时发生訪问冲突
原因总结:
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