char *p 与char p[] 比较

简介: char *p 与char p[] 比较

所有的字符窜常量都被放在静态内存

因为字符串常量很少需要修改,放在静态内存区会提高效率

例:

char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << ( str1 == str2 ) << endl;   // 0
cout << ( str3 == str4 ) << endl;   // 0
cout << ( str5 == str6 ) << endl;   // 1
cout << ( str7 == str8 ) << endl;   // 1

str1,str2,str3,str4是数组变量,它们有各自的内存空间;

而str5,str6,str7,str8是指针,它们指向相同的常量区域。

引入问题,看看下面的程序的输出:

程序段1:

#include <stdio.h>
char *returnStr()
{
    char *p="hello world!";
    return p;
}
int main()
{
    char *str=NULL;       //一定要初始化,好习惯
     str=returnStr();
    printf("%s\n", str);
    return 0;
}

程序段2:

#include <stdio.h>
char *returnStr()
{
    char p[]="hello world!";
    return p;
}
int main()
{
    char *str=NULL;//一定要初始化,好习惯
     str=returnStr();
    printf("%s\n", str);
    return 0;
}

程序段1没有任何问题,可以征程输出"hello world"。因为"hello world!"是一个字符串常量,存放在静态数据区,把该字符串常量存放的静态数据区的首地址赋值给了指针,所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。

程序段2不能输出。分析如下:

"hello world!"是一个字符串常量,存放在静态数据区,没错,

但是把一个字符串常量赋值给了一个局部变量(char []型数组),该局部变量存放在栈中,

这样就有两块内容一样的内存,也就是说“char p[]=“hello world!”;”这条语句让“hello world!”这个字符串在内存中有两份拷贝,一份在动态分配的栈中,另一份在静态存储区。这是与前者最本质的区别,当returnStr函数退出时,栈要清空,局部变量的内存也被清空了,所以这时的函数返回的是一个已被释放的内存地址,所以打印出来的是乱码。


目录
相关文章
|
6月前
char[] 转String时的陷阱
char[] 转String时的陷阱
22 1
char、signed char和unsigned char
char、signed char和unsigned char
217 0
char*转为LPCWSTR
char*转为LPCWSTR
73 0
vs2017 :C2440 错误,无法从 const char[] 转换为 char*问题解决
vs2017 :C2440 错误,无法从 const char[] 转换为 char*问题解决
637 0
vs2017 :C2440 错误,无法从 const char[] 转换为 char*问题解决
|
Unix Linux C++
C/C++---关于int main( int argc, char* argv[] ) 中arg和argv参数的解析
C/C++---关于int main( int argc, char* argv[] ) 中arg和argv参数的解析
394 0
|
C++ Linux
const char*, char const*, char*const的区别
const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。 这个知识易混点之前是看过了,今天做Linux上写GTK程序时又出现个Warning,发散一下又想到这个问题,于是翻起来重嚼一下。 事实上这个概念谁都有只是三种声明方式非常相似: Bjarne在他的The C++ Programming Language里面给出过一个助
1173 0
捋一捋 const char * p / char* const p / char const* p
const int *p 与 int const *p 是一样的,即 *p 是常量; 而 int * const p 跟上面是不一样的,即 p 是常量; 我们知道引用只是一个别名,与变量共享存储空间,并且必须在定义的时候初始化,而且不能再成为别的变量的别名,这让我们想到什么呢,貌似跟  int * const p   的性质很像。
1185 0