y**b 发帖数: 10166 | 1 void func() {
char s[]="abc"; // 在stack上分配空间存储"abc",sizeof(s)等于4
int i[]={1,2,3}; //同上, sizeof(i)等于12
char *ps="def"; // 在常量区存储"def",sizeof(ps)==8
int *pi=new int[3]; // 在heap分配空间存储,sizeof(pi)==8
delete [] pi;
}
以上对否?
这个常量存储区同初始化数据段/非初始化数据段是什么关系?
看网上有人把c/c++内存布局描述如下:
1、栈区(stack)
2、堆区(heap)
3、全局区(静态区):初始化数据段/非初始化数据段
4、文字常量区
5、程序代码区 | r****t 发帖数: 10904 | 2 第一个其实"abc" 在常量区也有,你注释的那句话也没错。
sizeof 对数组就是返回元素个数。
同理,后面的 ps 和 pi 都在 stack 上,你注释的也都对,只不过一
个指向常量区,一个指向 heap 里面一地。
以上纯属猜测。
常量区和数据段是两分开东西,没啥关系:
http://en.wikipedia.org/wiki/Data_segment
PS: array type is different from ptr type, but there's a default conversion from array type to ptr type. (an impression got from reading primer)
【在 y**b 的大作中提到】 : void func() { : char s[]="abc"; // 在stack上分配空间存储"abc",sizeof(s)等于4 : int i[]={1,2,3}; //同上, sizeof(i)等于12 : char *ps="def"; // 在常量区存储"def",sizeof(ps)==8 : int *pi=new int[3]; // 在heap分配空间存储,sizeof(pi)==8 : delete [] pi; : } : 以上对否? : 这个常量存储区同初始化数据段/非初始化数据段是什么关系? : 看网上有人把c/c++内存布局描述如下:
| z****e 发帖数: 2024 | 3 char s[] is a constant pointer which can not be changed.
char *ps is a regular pointer.
【在 y**b 的大作中提到】 : void func() { : char s[]="abc"; // 在stack上分配空间存储"abc",sizeof(s)等于4 : int i[]={1,2,3}; //同上, sizeof(i)等于12 : char *ps="def"; // 在常量区存储"def",sizeof(ps)==8 : int *pi=new int[3]; // 在heap分配空间存储,sizeof(pi)==8 : delete [] pi; : } : 以上对否? : 这个常量存储区同初始化数据段/非初始化数据段是什么关系? : 看网上有人把c/c++内存布局描述如下:
| s********k 发帖数: 6180 | 4 char *ps is the constant pointer. if you assign
char *ps = "def" later, there will be linker error for segmentation fault.
【在 z****e 的大作中提到】 : char s[] is a constant pointer which can not be changed. : char *ps is a regular pointer.
| t****t 发帖数: 6806 | 5 这挖坟不说, 挖了坟还要胡说八道一下.
【在 s********k 的大作中提到】 : char *ps is the constant pointer. if you assign : char *ps = "def" later, there will be linker error for segmentation fault.
| B******5 发帖数: 4676 | 6 专家给解释一下吧,也想学习一下~
【在 t****t 的大作中提到】 : 这挖坟不说, 挖了坟还要胡说八道一下.
| t****t 发帖数: 6806 | 7 不是都有解释了么, 前面的人说得都差不多对, 只有最后挖坟那位说错了
【在 B******5 的大作中提到】 : 专家给解释一下吧,也想学习一下~
| B******5 发帖数: 4676 | 8 嗯,就是被挖坟的搞晕了
【在 t****t 的大作中提到】 : 不是都有解释了么, 前面的人说得都差不多对, 只有最后挖坟那位说错了
|
| d****n 发帖数: 1637 | 9 char *p="abc"; 在代码段,immutable.
any write operation will cause segfault.
char a[]="abc"; stack, read/write okay
#include
#include
int main(){
char *p="abc";
printf("%p\n",p );
*(p+1)='w'; //segfault
free(p); //segfault or
glibc fault
p =(char *) malloc (sizeof(char)*4) ; //okay, but previous "abc" lost
printf("%p\n",p );
char a[]="def";
printf("%p\t%s\n",a,a); //okay
a[0]='x'; //okay
printf("%p\t%s\n",a,a);
}
output in my linux.
###########
0x400658 <-low address (at program text)
0x17798010 <-high address (in heap)
0x7fff7aec3c20 def // in stack
0x7fff7aec3c20 xef // address no change and writable
############## | j*a 发帖数: 14423 | 10 makes sense
sizeof(p)*3==sizeof(a) is true
space refered by a must be writable
or
【在 d****n 的大作中提到】 : char *p="abc"; 在代码段,immutable. : any write operation will cause segfault. : char a[]="abc"; stack, read/write okay : #include : #include : int main(){ : char *p="abc"; : printf("%p\n",p ); : *(p+1)='w'; //segfault : free(p); //segfault or
| e****d 发帖数: 895 | 11 sizeof(p) is the size of the pointer, not char size.
also, sizeof(a) includes '\0'
【在 j*a 的大作中提到】 : makes sense : sizeof(p)*3==sizeof(a) is true : space refered by a must be writable : : or
| J*****n 发帖数: 4859 | 12
or
Yes, it used to be an interview problem from credit suisse.
【在 d****n 的大作中提到】 : char *p="abc"; 在代码段,immutable. : any write operation will cause segfault. : char a[]="abc"; stack, read/write okay : #include : #include : int main(){ : char *p="abc"; : printf("%p\n",p ); : *(p+1)='w'; //segfault : free(p); //segfault or
|
|