char a[]与char *a,该怎么处理
char a[]与char *a
二者本质上有什么区别?
char *get()
{
char *a="test string";
return a;
}
这个没有问题,
char *get()
{
char a[]="test string";
return a;
}
这个却有问题。
高手解释下!
------解决方案--------------------
char *a="test string"; --->字符串在静态常量区,函数退出后仍存在,所以返回有效
char a[]="test string"; --->字符串在栈上,函数退出后自动销毁,所以返回无效
------解决方案--------------------
char *get()
{
char *a="test string"; //指向const区的数据
return a;
}
这个没有问题,
char *get()
{
char a[]="test string"; //普通栈区数据
return a;
}
此外前者 a是指针,后者a是数组,表达形式不可混用,有区别,传2维参数的时候就体现出来了.
------解决方案--------------------
char *a 定义的是字符指针, 它的值是可以改变的,
char *a="test string"; 会将字符串常量的地址直接赋值给a, 所以这个a的值可以返回给调用者
char a[] 定义的是字符数组, 它是指分配的一段内存空间的位置, 一旦分配就不要改变,
char a[]="test string"; 则是分配一块内存空间, 将字符串常量复制过来,
因为这段代码在函数中, 所以它是在栈上分配的空间, 一旦函数调用结束, 返回的这个值成为一个野指针, 导致错误出现
最后简单总结一下:
char *a="test string"; 只需要传入地址, 不另外分配内存空间,
char a[]="test string"; 则需要分配内存空间, 再复制字符串
------解决方案--------------------
二者本质上有什么区别?
char *get()
{
char *a="test string";
return a;
}
这个没有问题,
char *get()
{
char a[]="test string";
return a;
}
这个却有问题。
高手解释下!
------解决方案--------------------
char *a="test string"; --->字符串在静态常量区,函数退出后仍存在,所以返回有效
char a[]="test string"; --->字符串在栈上,函数退出后自动销毁,所以返回无效
------解决方案--------------------
char *get()
{
char *a="test string"; //指向const区的数据
return a;
}
这个没有问题,
char *get()
{
char a[]="test string"; //普通栈区数据
return a;
}
此外前者 a是指针,后者a是数组,表达形式不可混用,有区别,传2维参数的时候就体现出来了.
------解决方案--------------------
char *a 定义的是字符指针, 它的值是可以改变的,
char *a="test string"; 会将字符串常量的地址直接赋值给a, 所以这个a的值可以返回给调用者
char a[] 定义的是字符数组, 它是指分配的一段内存空间的位置, 一旦分配就不要改变,
char a[]="test string"; 则是分配一块内存空间, 将字符串常量复制过来,
因为这段代码在函数中, 所以它是在栈上分配的空间, 一旦函数调用结束, 返回的这个值成为一个野指针, 导致错误出现
最后简单总结一下:
char *a="test string"; 只需要传入地址, 不另外分配内存空间,
char a[]="test string"; 则需要分配内存空间, 再复制字符串
------解决方案--------------------
- C/C++ code
char *get() { char *a="test string"; // 定义的是字符指针, 它的值是可以改变的;编译后字符串位于静态常量区,所以函数退出后仍存在,所以返回的结果总是有效 return a; } char *get() { char a[]="test string"; // 则是在堆栈上分配一块内存空间, 将字符串常量复制过来;当get函数退出后会自动销毁,所以返回不一定正确(如果没有破坏堆栈中"test string",那么就是正确的) return a; }