由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++ Q87: What is wrong with this swap function? (转载)
相关主题
问个C++中重复删除指针的问题Use std::swap to exchange pointers and iterators
Question about type conversion (转载)请教两道linux面试题目
C++问题: 指针变量是哪里产生的?difference between: char** p and char*p[] ??
dereference a NULL pointer in CC++ pointer problem
不如各位高手挑个专题讲讲C++11吧请教 C++的一个困惑 (operator delete)
关于void指针问一个关于C++指针的问题
作为返回值得实参是用指针还是引用比较好?纯虚函数问题
C++ Q05: pointer to constant variable请教一个const pointer的问题
相关话题的讨论汇总
话题: int话题: swap话题: void话题: aptr话题: bptr
进入Programming版参与讨论
1 (共1页)
c**********e
发帖数: 2007
1
【 以下文字转载自 JobHunting 讨论区 】
发信人: careerchange (Stupid), 信区: JobHunting
标 题: C++ Q87: What is wrong with this swap function?
发信站: BBS 未名空间站 (Sun Oct 9 12:20:26 2011, 美东)
void swap(int *a, int *b) {
int *c;
*c=*a;
*a=*b;
*b=*c;
return;
}
int main() {
int x=5, y=10;
swap(&x, &y);
cout << x << " " << y << endl;
return 0;
}
The correct result is printed, but there is a segmentation fault. Is it
because *c is a local variable?
C***y
发帖数: 2546
2
指针c没有指向任何内存
*c = *a肯定不能执行

【在 c**********e 的大作中提到】
: 【 以下文字转载自 JobHunting 讨论区 】
: 发信人: careerchange (Stupid), 信区: JobHunting
: 标 题: C++ Q87: What is wrong with this swap function?
: 发信站: BBS 未名空间站 (Sun Oct 9 12:20:26 2011, 美东)
: void swap(int *a, int *b) {
: int *c;
: *c=*a;
: *a=*b;
: *b=*c;
: return;

c**********e
发帖数: 2007
3
Thank you. You pointed out the problem. The following statement would solve
the problem.
int *c =new int;

You are right, though *c = *a is executed. My wrong code produces the
correct answer with a segmentation fault.

【在 C***y 的大作中提到】
: 指针c没有指向任何内存
: *c = *a肯定不能执行

h****r
发帖数: 2056
4
This is not a good idea either, you have to remember to delete the c later.

solve

【在 c**********e 的大作中提到】
: Thank you. You pointed out the problem. The following statement would solve
: the problem.
: int *c =new int;
:
: You are right, though *c = *a is executed. My wrong code produces the
: correct answer with a segmentation fault.

a***y
发帖数: 2803
5
void swap(int *a, int *b) {
int c;
c=*a;
*a=*b;
*b=c;
}

【在 c**********e 的大作中提到】
: Thank you. You pointed out the problem. The following statement would solve
: the problem.
: int *c =new int;
:
: You are right, though *c = *a is executed. My wrong code produces the
: correct answer with a segmentation fault.

X****r
发帖数: 3557
6
You must be kidding.
d****n
发帖数: 1637
7
Sorry being a noobie.
this should be what I was talking about.
the 1st version was wrong.
#######################################
#include
void swap(void **firstPtr, void **secondPtr)
{
void *temp = *firstPtr;
*firstPtr = *secondPtr;
*secondPtr = temp;
return;
}
int main()
{
int a = 10;
int b = 20;
int *aPtr = &a;
int *bPtr = &b;
printf("Before Swapping, Address : %x %x, Value : %d %d\n", aPtr, bPtr,
*
aPtr, *bPtr);
swap(&aPtr, &bPtr);
printf("After Swapping, Address : %x %x, Value : %d %d\n", aPtr, bPtr,
*
aPtr, *bPtr);
}

【在 X****r 的大作中提到】
: You must be kidding.
t****t
发帖数: 6806
8
这个没有第一个这么noob, 但是a和b还是没有交换过来啊.

【在 d****n 的大作中提到】
: Sorry being a noobie.
: this should be what I was talking about.
: the 1st version was wrong.
: #######################################
: #include
: void swap(void **firstPtr, void **secondPtr)
: {
: void *temp = *firstPtr;
: *firstPtr = *secondPtr;
: *secondPtr = temp;

d****n
发帖数: 1637
9
恩, 但是是交换了pointer, 看怎么用了 。
如果paramters 是非常大的obj, 还是只交换pointer 好。
这个版本没有产生内部的obj。所以因该更快些。
至于真的交换a b, 我觉得一般都没有这个必要。
推荐pointer 版本

【在 t****t 的大作中提到】
: 这个没有第一个这么noob, 但是a和b还是没有交换过来啊.
a***y
发帖数: 2803
10
void swap(int *a, int *b) {
int *c;
if (a && b) {
c=a;
*a=*b;
*b=*c;
}
}

【在 c**********e 的大作中提到】
: Thank you. You pointed out the problem. The following statement would solve
: the problem.
: int *c =new int;
:
: You are right, though *c = *a is executed. My wrong code produces the
: correct answer with a segmentation fault.

相关主题
关于void指针Use std::swap to exchange pointers and iterators
作为返回值得实参是用指针还是引用比较好?请教两道linux面试题目
C++ Q05: pointer to constant variabledifference between: char** p and char*p[] ??
进入Programming版参与讨论
a***y
发帖数: 2803
11
1.指针c没有初始化.
2.没有考虑到如果a或者b是NULL的情况.

【在 c**********e 的大作中提到】
: Thank you. You pointed out the problem. The following statement would solve
: the problem.
: int *c =new int;
:
: You are right, though *c = *a is executed. My wrong code produces the
: correct answer with a segmentation fault.

d****n
发帖数: 1637
12
没必要这么多判断吧,就是演示下为什么segfault.
如果要是叫真,还可以加上a!=b

【在 a***y 的大作中提到】
: 1.指针c没有初始化.
: 2.没有考虑到如果a或者b是NULL的情况.

a***y
发帖数: 2803
13
a=b也可swap啊.

【在 d****n 的大作中提到】
: 没必要这么多判断吧,就是演示下为什么segfault.
: 如果要是叫真,还可以加上a!=b

d****n
发帖数: 1637
14
可以是可以,但是这个木有任何意义啊。
如果你要加个a&&b!=NULL, 为什么不加入a!=b。
好了,不扯了。工作去了

【在 a***y 的大作中提到】
: a=b也可swap啊.
a***y
发帖数: 2803
15
这个很有必要噢,防止a,b是null的意外情况,出现严重错误.a=b不会出现任何严重错误.

【在 d****n 的大作中提到】
: 可以是可以,但是这个木有任何意义啊。
: 如果你要加个a&&b!=NULL, 为什么不加入a!=b。
: 好了,不扯了。工作去了

d****n
发帖数: 1637
16
my point is that making sense to swap two element actually same.

误.

【在 a***y 的大作中提到】
: 这个很有必要噢,防止a,b是null的意外情况,出现严重错误.a=b不会出现任何严重错误.
d*******u
发帖数: 186
17
In your code c is a pointer, and uninitialized.that's the problem.
void swap(int *a, int *b) {
int c;
c=*a;
*a=*b;
*b=c;
return;
}

【在 c**********e 的大作中提到】
: Thank you. You pointed out the problem. The following statement would solve
: the problem.
: int *c =new int;
:
: You are right, though *c = *a is executed. My wrong code produces the
: correct answer with a segmentation fault.

t****t
发帖数: 6806
18
本来想着厚道一点算了, 不过现在我只能说, 很好笑的逻辑.

【在 d****n 的大作中提到】
: 恩, 但是是交换了pointer, 看怎么用了 。
: 如果paramters 是非常大的obj, 还是只交换pointer 好。
: 这个版本没有产生内部的obj。所以因该更快些。
: 至于真的交换a b, 我觉得一般都没有这个必要。
: 推荐pointer 版本

d****n
发帖数: 1637
19
哪里好笑?请指教。为什么笑都说说,笑的开心点。

【在 t****t 的大作中提到】
: 本来想着厚道一点算了, 不过现在我只能说, 很好笑的逻辑.
t****t
发帖数: 6806
20
发工资的时候, 你该得5000美元. 会计说美元没了, 给你5000里拉行不行? 看你怎么用
了. 在意大利, 推荐用里拉!

【在 d****n 的大作中提到】
: 哪里好笑?请指教。为什么笑都说说,笑的开心点。
相关主题
C++ pointer problem纯虚函数问题
请教 C++的一个困惑 (operator delete)请教一个const pointer的问题
问一个关于C++指针的问题一个C的void指针的问题
进入Programming版参与讨论
d****n
发帖数: 1637
21
哎,算了。还是你厉害

【在 t****t 的大作中提到】
: 发工资的时候, 你该得5000美元. 会计说美元没了, 给你5000里拉行不行? 看你怎么用
: 了. 在意大利, 推荐用里拉!

t****t
发帖数: 6806
22
本来交换a和b, 你说交换a和b太麻烦, 我们交换pa=&a和pb=&b吧, 看你怎么用了. 推荐
交换pa和pb!
这逻辑实在很强大. 笑笑而已, 跟我厉不厉害没有半点关系.
吃饭太麻烦, 还要花钱. 不吃算了. 不吃也可以辟谷的, 看你怎么辟了, 说不定还能升
仙呢. 推荐不吃!

【在 d****n 的大作中提到】
: 哎,算了。还是你厉害
d****n
发帖数: 1637
23
我从头到尾都没说直接swap a and b 麻烦。
其实我的版本更麻烦。希望你仔细看前面。
我的point在于,你在function 里面创建一个obj,这个cost 如果是很复杂的obj的话,
会花费
很长时间,空间。
我的工作领域里面,一个obj甚至可能被创建1million times.这就会引起问题。
如果有类似swap function, 我会考虑用pointer调换。
所以我更青睐于调用pointer。
你是抱着讨论的态度来得,对吧?
有什么不对,请您指教。

【在 t****t 的大作中提到】
: 本来交换a和b, 你说交换a和b太麻烦, 我们交换pa=&a和pb=&b吧, 看你怎么用了. 推荐
: 交换pa和pb!
: 这逻辑实在很强大. 笑笑而已, 跟我厉不厉害没有半点关系.
: 吃饭太麻烦, 还要花钱. 不吃算了. 不吃也可以辟谷的, 看你怎么辟了, 说不定还能升
: 仙呢. 推荐不吃!

t****t
发帖数: 6806
24
好了不开玩笑.
第一, 写一个库函数, 首先要完成的是调用者的要求, 其次才是考虑节约成本. 你从头
到尾没完成调用的要求, 节约成本根本就是一句空话. 交换对象和交换对象的指针, 是
两件完全不同的事情. 库函数能做的, 是提供两个版本由调用者决定调用哪个.
第二, 回到本来的题目. 如果调用者要求交换指针, 应该是调用者自己把指针的指针传
进来, 就象你写的一样. 而不是库函数自己别出心裁, 限制只能交换指针或者"推荐"使
用指针的版本. 从根本上来说, 交换两个对象就是交换两个对象(指针也是对象之一).
除非知道对象内部的结构(即类本身有moving semantics或者specialize swap), 否则
创建一个新对象是不能避免的.

【在 d****n 的大作中提到】
: 我从头到尾都没说直接swap a and b 麻烦。
: 其实我的版本更麻烦。希望你仔细看前面。
: 我的point在于,你在function 里面创建一个obj,这个cost 如果是很复杂的obj的话,
: 会花费
: 很长时间,空间。
: 我的工作领域里面,一个obj甚至可能被创建1million times.这就会引起问题。
: 如果有类似swap function, 我会考虑用pointer调换。
: 所以我更青睐于调用pointer。
: 你是抱着讨论的态度来得,对吧?
: 有什么不对,请您指教。

d****n
发帖数: 1637
25
可能你真的没有仔细读我说的。
我指出的是另一个层次的问题。本来楼主和其他讨论者没有说过的角度。
你却咬着不放,非要说出个问题来。非要说这个怎么怎么不达到要求。
可是事实上,这个楼没有要求。你看清楚了么?
就象其他人说的 a&&b!=NULL 一样,是多层次的考虑。
好吧,你是guru。你所指出的我可以认为是software quality 层次的么?
请你不要为了批评而批评。

.

【在 t****t 的大作中提到】
: 好了不开玩笑.
: 第一, 写一个库函数, 首先要完成的是调用者的要求, 其次才是考虑节约成本. 你从头
: 到尾没完成调用的要求, 节约成本根本就是一句空话. 交换对象和交换对象的指针, 是
: 两件完全不同的事情. 库函数能做的, 是提供两个版本由调用者决定调用哪个.
: 第二, 回到本来的题目. 如果调用者要求交换指针, 应该是调用者自己把指针的指针传
: 进来, 就象你写的一样. 而不是库函数自己别出心裁, 限制只能交换指针或者"推荐"使
: 用指针的版本. 从根本上来说, 交换两个对象就是交换两个对象(指针也是对象之一).
: 除非知道对象内部的结构(即类本身有moving semantics或者specialize swap), 否则
: 创建一个新对象是不能避免的.

t****t
发帖数: 6806
26
楼主问what's wrong with this swap function, 要求就是指出/改正错误. 你贴个
code回答又不作说明, 我缺省就认为你是在改正错误. 但是你的code做的是别的事情.
PS if you want to discuss, no pointing finger to person, alright? whether I
am guru or not is not relevant.

【在 d****n 的大作中提到】
: 可能你真的没有仔细读我说的。
: 我指出的是另一个层次的问题。本来楼主和其他讨论者没有说过的角度。
: 你却咬着不放,非要说出个问题来。非要说这个怎么怎么不达到要求。
: 可是事实上,这个楼没有要求。你看清楚了么?
: 就象其他人说的 a&&b!=NULL 一样,是多层次的考虑。
: 好吧,你是guru。你所指出的我可以认为是software quality 层次的么?
: 请你不要为了批评而批评。
:
: .

d****n
发帖数: 1637
27
1 - 正确答案前面早有人说过了。我就是画蛇添足而已。就象a&&b!=NULL.
也算是卖弄一下吧。您呢,是我画了脚之后,又给脚上画了个靴子。
2 - 我没有用手指您。别太敏感了。我还没说你一直评论我呢。不是你一直在”大笑“ 我么?
你是不是弄反了,我该说这句?
3 - 欢迎以后继续技术讨论。

.
whether
I

【在 t****t 的大作中提到】
: 楼主问what's wrong with this swap function, 要求就是指出/改正错误. 你贴个
: code回答又不作说明, 我缺省就认为你是在改正错误. 但是你的code做的是别的事情.
: PS if you want to discuss, no pointing finger to person, alright? whether I
: am guru or not is not relevant.

1 (共1页)
进入Programming版参与讨论
相关主题
请教一个const pointer的问题不如各位高手挑个专题讲讲C++11吧
一个C的void指针的问题关于void指针
C++(非VC++) 删除链表时如何对指针操作? 在线等回复!谢谢!作为返回值得实参是用指针还是引用比较好?
这段code有啥问题?C++ Q05: pointer to constant variable
问个C++中重复删除指针的问题Use std::swap to exchange pointers and iterators
Question about type conversion (转载)请教两道linux面试题目
C++问题: 指针变量是哪里产生的?difference between: char** p and char*p[] ??
dereference a NULL pointer in CC++ pointer problem
相关话题的讨论汇总
话题: int话题: swap话题: void话题: aptr话题: bptr