由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问个C的基本问题
相关主题
Java 问题,请教如何找出一个array里的duplicate segments? (转载)为什么我这段简单的程序segment fault
再问个简单的C问题【为什么我写的reverse string总出错】
一个小的string面试题问个Print null的问题
C语言高手帮我看看下面代码,哪里错了啊,谢了请教两道linux面试题目 (转载)
C++ Q59: pointer & c-string (Bloomberg)分享今天做的一道基础题
这两个edit distance的code谁知道这个问题的答案
弱问一个小问题,leetcode 上merge sorted list求问一道G家Onsite题
一道微软面试题问一道精华帖的老题
相关话题的讨论汇总
话题: p1话题: p2话题: char话题: p3话题: data
进入JobHunting版参与讨论
1 (共1页)
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;

相关主题
这两个edit distance的code为什么我这段简单的程序segment fault
弱问一个小问题,leetcode 上merge sorted list【为什么我写的reverse string总出错】
一道微软面试题问个Print null的问题
进入JobHunting版参与讨论
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

相关主题
请教两道linux面试题目 (转载)求问一道G家Onsite题
分享今天做的一道基础题问一道精华帖的老题
谁知道这个问题的答案copy link with random additional pointers
进入JobHunting版参与讨论
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的星号都去掉,就可以输出正确结果。

1 (共1页)
进入JobHunting版参与讨论
相关主题
问一道精华帖的老题C++ Q59: pointer & c-string (Bloomberg)
copy link with random additional pointers这两个edit distance的code
reverse random pointers of a single linked list弱问一个小问题,leetcode 上merge sorted list
请教下copy list with random pointer一道微软面试题
Java 问题,请教如何找出一个array里的duplicate segments? (转载)为什么我这段简单的程序segment fault
再问个简单的C问题【为什么我写的reverse string总出错】
一个小的string面试题问个Print null的问题
C语言高手帮我看看下面代码,哪里错了啊,谢了请教两道linux面试题目 (转载)
相关话题的讨论汇总
话题: p1话题: p2话题: char话题: p3话题: data