h********m 发帖数: 116 | 1 下面这个程序为啥会segmentation fault呢?
int main(void)
{
char *p1, *p2;
*p1 = 'a';
*p2 = 'b';
printf("%c %c\n", *p1, *p2);
return 0;
}
如果我不用指针,把p1,p2的星号都去掉,就可以输出正确结果。 |
c****p 发帖数: 6474 | 2 p1和p2浮空,指向未定义的地址空间。
对未定义的地址空间进行读写操作会导致未定义的行为,包括段错。
【在 h********m 的大作中提到】 : 下面这个程序为啥会segmentation fault呢? : int main(void) : { : char *p1, *p2; : *p1 = 'a'; : *p2 = 'b'; : printf("%c %c\n", *p1, *p2); : return 0; : } : 如果我不用指针,把p1,p2的星号都去掉,就可以输出正确结果。
|
m********l 发帖数: 4394 | 3 这个看printf()怎么定义
显然, 他们不要你放星星
【在 h********m 的大作中提到】 : 下面这个程序为啥会segmentation fault呢? : int main(void) : { : char *p1, *p2; : *p1 = 'a'; : *p2 = 'b'; : printf("%c %c\n", *p1, *p2); : return 0; : } : 如果我不用指针,把p1,p2的星号都去掉,就可以输出正确结果。
|
h********m 发帖数: 116 | 4 不太明白,*p1, *p2我不是赋值了么?
如果不能这么直接print,那我该怎么输出*p1和*p2的值呢?分别赋给p3,p4?
我试了一下,下面这个程序还是segmentation fault呀?
int main(void)
{
char *p1, *p2, p3, p4;
*p1 = 'c';
*p2 = 'd';
p3 = *p1;
p4 = *p2;
printf("%c %c\n", p3, p4);
return 0;
}
【在 c****p 的大作中提到】 : p1和p2浮空,指向未定义的地址空间。 : 对未定义的地址空间进行读写操作会导致未定义的行为,包括段错。
|
l***g 发帖数: 1035 | 5 p1 p2 are pointers char*, they themselves do not have values but nulls. you
need to have p1, p2 malloc'ed to fix the problem.
or p3 = 'c'; p1 = &p3; so that p1 takes the address of p3
【在 h********m 的大作中提到】 : 不太明白,*p1, *p2我不是赋值了么? : 如果不能这么直接print,那我该怎么输出*p1和*p2的值呢?分别赋给p3,p4? : 我试了一下,下面这个程序还是segmentation fault呀? : int main(void) : { : char *p1, *p2, p3, p4; : *p1 = 'c'; : *p2 = 'd'; : p3 = *p1; : p4 = *p2;
|
b******n 发帖数: 4509 | 6 char *p1 这种定义,编译器会默认给 p1 赋值为 null,
然后你 *null 当然会出现 segment fault
【在 h********m 的大作中提到】 : 下面这个程序为啥会segmentation fault呢? : int main(void) : { : char *p1, *p2; : *p1 = 'a'; : *p2 = 'b'; : printf("%c %c\n", *p1, *p2); : return 0; : } : 如果我不用指针,把p1,p2的星号都去掉,就可以输出正确结果。
|
f*****r 发帖数: 754 | 7 加一句
p1 = new char;
【在 h********m 的大作中提到】 : 不太明白,*p1, *p2我不是赋值了么? : 如果不能这么直接print,那我该怎么输出*p1和*p2的值呢?分别赋给p3,p4? : 我试了一下,下面这个程序还是segmentation fault呀? : int main(void) : { : char *p1, *p2, p3, p4; : *p1 = 'c'; : *p2 = 'd'; : p3 = *p1; : p4 = *p2;
|
l***g 发帖数: 1035 | 8 that's cpp not c leh.
【在 f*****r 的大作中提到】 : 加一句 : p1 = new char;
|
i**********e 发帖数: 1145 | 9 不会。
C 或者 C++ 定义 pointer 是没有默认值的,pointer 的值就是 garbage
一些常见面试题的答案与总结 -
http://www.ihas1337code.com
【在 b******n 的大作中提到】 : char *p1 这种定义,编译器会默认给 p1 赋值为 null, : 然后你 *null 当然会出现 segment fault
|
i**********e 发帖数: 1145 | 10 p1 一直没有被赋值。
你赋的值是 *p1,也就是 p1 指向的地方。
但由于 p1 里的值没有被初始化,所以 p1 可以指向任意地方,这当然会造成
segmentation fault。
没有 segmentation fault 会更加恐怖,这意味着你程序里的 data 可能暗地里被修改
了!
一些常见面试题的答案与总结 -
http://www.ihas1337code.com
【在 h********m 的大作中提到】 : 不太明白,*p1, *p2我不是赋值了么? : 如果不能这么直接print,那我该怎么输出*p1和*p2的值呢?分别赋给p3,p4? : 我试了一下,下面这个程序还是segmentation fault呀? : int main(void) : { : char *p1, *p2, p3, p4; : *p1 = 'c'; : *p2 = 'd'; : p3 = *p1; : p4 = *p2;
|
|
|
r*******y 发帖数: 1081 | 11 should initialize p1, p2 firstly
【在 h********m 的大作中提到】 : 下面这个程序为啥会segmentation fault呢? : int main(void) : { : char *p1, *p2; : *p1 = 'a'; : *p2 = 'b'; : printf("%c %c\n", *p1, *p2); : return 0; : } : 如果我不用指针,把p1,p2的星号都去掉,就可以输出正确结果。
|
b******n 发帖数: 4509 | 12 c c++ 中的全局指针应该是默认 null 的,
c++ 种类成员应该也是默认 null 的,
至于临时变量应该是和编译器相关吧
【在 i**********e 的大作中提到】 : 不会。 : C 或者 C++ 定义 pointer 是没有默认值的,pointer 的值就是 garbage : 一些常见面试题的答案与总结 - : http://www.ihas1337code.com
|
c***2 发帖数: 838 | 13 this is the basic pointer issue.
another way to understand:
char *p1, *p2;
only declares two addresses of char.
read "Pointers and Memory" at
http://cslibrary.stanford.edu/102/
【在 h********m 的大作中提到】 : 下面这个程序为啥会segmentation fault呢? : int main(void) : { : char *p1, *p2; : *p1 = 'a'; : *p2 = 'b'; : printf("%c %c\n", *p1, *p2); : return 0; : } : 如果我不用指针,把p1,p2的星号都去掉,就可以输出正确结果。
|
h********m 发帖数: 116 | 14 你说的对,我试了一下 if(p1== NULL)也不对,所以p1应该不是NULL,而是garbage。
最前面malloc一下就好了。
【在 i**********e 的大作中提到】 : 不会。 : C 或者 C++ 定义 pointer 是没有默认值的,pointer 的值就是 garbage : 一些常见面试题的答案与总结 - : http://www.ihas1337code.com
|
p******x 发帖数: 691 | 15 p1 and p2是指针 , 就是表示的是地址
地址在没有赋值前, 利用该地址访问内存空间 会发生随机错误 因为你不知道该地址
到底指向哪个内存单元
所以在使用某个地址 即指针之前 必须对它赋值(赋予有效地址)
然后才能利用*p1 去访问p1指向的内存单元进行读写操作
【在 h********m 的大作中提到】 : 不太明白,*p1, *p2我不是赋值了么? : 如果不能这么直接print,那我该怎么输出*p1和*p2的值呢?分别赋给p3,p4? : 我试了一下,下面这个程序还是segmentation fault呀? : int main(void) : { : char *p1, *p2, p3, p4; : *p1 = 'c'; : *p2 = 'd'; : p3 = *p1; : p4 = *p2;
|
p******x 发帖数: 691 | 16
这个是因为全局变量放在 程序地址空间的initdata区
在程序被运行, 进行初始化的时候 设置0 利于减小开销
临时变量(local variables )如果在stack frame里面, 一般不进行初始化 如gcc
就不对它进行初始化
如果进行初始化 会增加开销
【在 b******n 的大作中提到】 : c c++ 中的全局指针应该是默认 null 的, : c++ 种类成员应该也是默认 null 的, : 至于临时变量应该是和编译器相关吧
|
i**********e 发帖数: 1145 | 17 Yes, you are right.
This include static variables.
一些常见面试题的答案与总结 -
http://www.ihas1337code.com
gcc
【在 p******x 的大作中提到】 : : 这个是因为全局变量放在 程序地址空间的initdata区 : 在程序被运行, 进行初始化的时候 设置0 利于减小开销 : 临时变量(local variables )如果在stack frame里面, 一般不进行初始化 如gcc : 就不对它进行初始化 : 如果进行初始化 会增加开销
|
m********l 发帖数: 4394 | 18 牛人。
so, where do static variables reside? which segment in the process?
【在 i**********e 的大作中提到】 : Yes, you are right. : This include static variables. : 一些常见面试题的答案与总结 - : http://www.ihas1337code.com : : gcc
|
i**********e 发帖数: 1145 | 19 same as global variable, static variables reside in the data segment for the
entire lifetime of the process.
this is true for C-style literal string too, e.g. char *s = "hello world";
Even though it seemed that it's declared locally, it is stored in the data
segment and thus is available throughout the lifetime of the process. Also
note that it is stored as read-only... That's why most people don't
understand why something like s[2] = 'c' and get segmentation fault.
一些常见面试题的答案与总结 -
http://www.ihas1337code.com
【在 m********l 的大作中提到】 : 牛人。 : so, where do static variables reside? which segment in the process?
|
c****p 发帖数: 6474 | 20 现在data segment还分read only和writeable么。。。
我学汇编的时候data segment里的东西全是可读写的。。
我上学期给学生带32位MIPS汇编的时候,见过把只读变量放在text segment的样例。
the
data
【在 i**********e 的大作中提到】 : same as global variable, static variables reside in the data segment for the : entire lifetime of the process. : this is true for C-style literal string too, e.g. char *s = "hello world"; : Even though it seemed that it's declared locally, it is stored in the data : segment and thus is available throughout the lifetime of the process. Also : note that it is stored as read-only... That's why most people don't : understand why something like s[2] = 'c' and get segmentation fault. : 一些常见面试题的答案与总结 - : http://www.ihas1337code.com
|
|
|
m********l 发帖数: 4394 | 21 cool. i was confused because i thought you said global variables are on
the stack.
Okay, got a side queestion on cpp:
when an new object is created out of a class, do the class's code get
copied?
I know it's a No, but how do they share the code while retaining
different data?
for the
world";
data
Also
【在 i**********e 的大作中提到】 : same as global variable, static variables reside in the data segment for the : entire lifetime of the process. : this is true for C-style literal string too, e.g. char *s = "hello world"; : Even though it seemed that it's declared locally, it is stored in the data : segment and thus is available throughout the lifetime of the process. Also : note that it is stored as read-only... That's why most people don't : understand why something like s[2] = 'c' and get segmentation fault. : 一些常见面试题的答案与总结 - : http://www.ihas1337code.com
|
i**********e 发帖数: 1145 | 22 Each object has its own data,but all member functions share the same code,
which has the function pointer points to the same location in the memory.
Right?
一些常见面试题的答案与总结 -
http://www.ihas1337code.com
【在 m********l 的大作中提到】 : cool. i was confused because i thought you said global variables are on : the stack. : Okay, got a side queestion on cpp: : when an new object is created out of a class, do the class's code get : copied? : I know it's a No, but how do they share the code while retaining : different data? : : for the : world";
|
c****p 发帖数: 6474 | 23 我猜cpp的object的底层实现类似于一个C的结构体。
struct{
DTYPE1 ...
DTYPE2 ...
...
FTYPE1 (*f)(...);
FTYPE2 (*f)(...);
...
} ...;
这样运行ob的成员函数的时候,只是调用了成员函数的入口地址,
而函数的参数还是该ob的成员数据。
这样就不用拷code了。
【在 m********l 的大作中提到】 : cool. i was confused because i thought you said global variables are on : the stack. : Okay, got a side queestion on cpp: : when an new object is created out of a class, do the class's code get : copied? : I know it's a No, but how do they share the code while retaining : different data? : : for the : world";
|
p******x 发帖数: 691 | 24 Right.
【在 i**********e 的大作中提到】 : Each object has its own data,but all member functions share the same code, : which has the function pointer points to the same location in the memory. : Right? : 一些常见面试题的答案与总结 - : http://www.ihas1337code.com
|
m********l 发帖数: 4394 | 25 啊。。。谢谢
我不懂的就是这个。
我还以为运行成员函数时要把ob的指针传进去, 不然函数就无法operate on the data.
【在 c****p 的大作中提到】 : 我猜cpp的object的底层实现类似于一个C的结构体。 : struct{ : DTYPE1 ... : DTYPE2 ... : ... : FTYPE1 (*f)(...); : FTYPE2 (*f)(...); : ... : } ...; : 这样运行ob的成员函数的时候,只是调用了成员函数的入口地址,
|
L**********1 发帖数: 797 | 26
因为指针没有指向真正的地址空间。
【在 h********m 的大作中提到】 : 下面这个程序为啥会segmentation fault呢? : int main(void) : { : char *p1, *p2; : *p1 = 'a'; : *p2 = 'b'; : printf("%c %c\n", *p1, *p2); : return 0; : } : 如果我不用指针,把p1,p2的星号都去掉,就可以输出正确结果。
|