指针相关总结2
4 字符串指针与字符数组的区别
问题:
void main(){ char *s=new char[5]; s="abcd"; s[2]='y'; } 执行时会有内存读写错误,但是改为: void main(){ char s[]="abcd"; s[2]='y'; } 却没有错误,我知道变量一个在堆区,一个在栈区,为什么会出现这个问题
回答:
关键是s="abcd"有问题,即使s不是动态指针(比如char * c="hello"),也会报错。
char *s只是个指针而已,没有分配存储空间的,(指针只是指向某一块内存)
而"abcd"是字符串常量,它是被储存在内存的静态区中的,静态区中的数据是不能被更改的,
char s[]="abcd"等于是你在栈中为s开辟了一个5字节的空间(数组是自己有开辟了内存)
等价于char s[5],所以这个时候你把一个字符s[2]='y'等于是把y放入了栈中
5.字符连接函数
关于strcat()(连接函数)的第一个参数, char a[] = "abcd"; char* b = "abcd"; char c[] = "efg";
strcat(b, c)运行出错,可是为什么strcat(a,c)可以?
最佳答案
其实strcat(b, c),strcat(a,c)都有错
通俗的来讲:
strcat(b, c)运行出错是因为b是一个指向常量字符串的指针,指向的是一片不能运行时改变的内存区域,向内存区域中写入其它的数据,必然会使程序崩溃;而a则是指向一个变量内存区域,是可以动态改变的,a虽然没有足够的空间导致溢出(因为char a[] = "abcd",数组的长度为5,固定下来了),但c语言不检查数组越界,依然可以写入,但是写入的内纯区域已经不受控制,说不定就覆盖了某些其它变量,是很危险的操作,出错了也很难查找原因。。。
注意char a[] ={'a','b','c','d'}; 数组a的长度为4,
char a[] = "abcd",数组a的长度为5,等价于char a[] ={'a','b','c','d.' ''};
6.声明指针变量时系统分配的内存,和指针所指向的内存
这么跟你说,指针本身也是一种变量,就和int型一样,假如你声明int a,其中a是变量名,有自己的一个地址,然后a的值,是另外一个地址,计算机通过变量名就能知道变量值是多少,同样的道理,你声明int *p,*p是变量名,在计算机中是有独立的内存空间用来存放*p的,这样明白吗?只有当你给*p赋值的时候,*p才会指向其他的内存空间,存放指针变量本身的内存是一直都在的,也就说声明指针变量时系统分配的内存,和指针所指向的内存,是两个不同的概念