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 | | 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.
| | | 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 的大作中提到】 : 哪里好笑?请指教。为什么笑都说说,笑的开心点。
| | | 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.
|
|