boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - char s[]和char *ps的不同
相关主题
帮忙找个错
问个字符串的基本问题
高人指点怎么在embedded sys(atmel 系列)上写内存管理 (转载)
问个c语言的问题
free(char *)的问题 (转载)
大家看看这个简单的qsort排序的问题
再问一个free()的问题
数组问题
看下这个小程序
怎么得到char *分配空间的大小?
相关话题的讨论汇总
话题: char话题: sizeof话题: ps话题: abc话题: def
进入Programming版参与讨论
1 (共1页)
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

1 (共1页)
进入Programming版参与讨论
相关主题
怎么得到char *分配空间的大小?
我也来个。某公司招初级C程序员的面试题。[转载]
请教C的类型转换问题
呼叫THRUST等C语言牛牛,菜鸟级C语言指针问题
C 语言,初学者,简单问题
c的问题
Array in C
Question about memset() and memmove() size limit
solidot上看来的
刚看完类这一章,有些大小问题,请指教,谢谢
相关话题的讨论汇总
话题: char话题: sizeof话题: ps话题: abc话题: def