您的位置:首页 > 编程语言 > C语言/C++

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

2017-12-01 16:35 344 查看
字符串数组,字符串指针的区别。

字符串数组:

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’的,函数一旦调用结束,就会释放这个函数的栈区空间,再返回他的地址,所对应的内容,就会出错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息