关于字符串数组,字符串指针(C语言)

来源:互联网 发布:淘宝点了收藏没反应 编辑:程序博客网 时间:2024/06/01 10:17

字符串数组,字符串指针的区别。

字符串数组:
char buf[] = "abcd";
首先在内存字符常量区分配一块内存空间放下”abcd\0”,然后在栈中分配一块连续的内存空间,将字符常量区的”abcd\0”复制到栈中。所以,字符串数组的头指针buf所指向的字符串首地址在栈中,故是可以进行读写操作的。

字符串指针:
char * ptr = "abcd";
首先还是在内存字符常量区分配一块内存空间放下”abcd\0”,并将字符常量区”abcd”的首地址赋给指针ptr。所以ptr指针本身分配在栈中,而它所指向的字符串首地址是在文字常量区,故只能够读,不能够写。

(字符串指针还有一种情况是
char * ptr = (char *)malloc(5 * sizeof(char));
strcpy(ptr, "abcd");
首先在堆区分配一块长度为5的内存空间,首地址赋给ptr,接着还是在内存字符常量区分配一块内存空间放下”abcd\0”,然后把文字常量区中的”abcd\0”复制到堆中。此时ptr指针本身在栈中,它所指向的字符串首地址在堆中,所以也可以进行读写操作。

所以像下面这种情况就不难理解了

char * getstring1() {char * p1 = "ac";return p1;}char * getstring2() {char * p2 = "ac";return p2;}char * func_1() {char buff[3] = "ac";return buff;}int main(){char * p1 = getstring1();char * p2 = getstring2();char * p3 = func_1();printf("%d %s\n", p1, p1);printf("%d %s\n", p2, p2);printf("%d %s\n", p3, p3);   getch();return 0;}

最后的结果是p1,p2指向同一个地址,并且能够正常显示出”ac”,
而p3却显示错误。

原因就是p1指针指向的是文字常量区,并且返回的值文字常量区的地址,
p1本身的地址是被弹栈了,但是它所指向的地址,还是存在的,
至于为什么地址相同,是因为指针指向的都是文字常量区同一个字符串地址。
而func_1()使用的是一个字符串数组,是在栈中开辟空间来存放ac和‘\0’的,函数一旦调用结束,就会释放这个函数的栈区空间,再返回他的地址,所对应的内容,就会出错。

原创粉丝点击