黑马程序员技术交流社区

标题: 经典指针问题,为什么不能传入两个指针来获得值 [打印本页]

作者: Micro    时间: 2015-2-14 22:59
标题: 经典指针问题,为什么不能传入两个指针来获得值
本帖最后由 Micro 于 2015-2-14 23:00 编辑

  1. 这个是对的。
复制代码
  1. // 定义一个函数 ,可以用来 两个数的和同时,并计算是两个数的差;
  2. #include<stdio.h>
  3. int sumAndCha(int a,int b, int *cha);
  4. int main(){
  5.     int  *cha;
  6.     int sum=sumAndCha(12,14,cha);
  7.     printf("sum=%d,cha=%d\n",sum, *cha);
  8.     return 0;
  9. }

  10. int sumAndCha(int a,int b, int *cha){
  11.     int sum =0;
  12.     sum=a+b;
  13.     *cha= a-b;
  14.     return sum;
  15. }
复制代码

  1. 但是,问题来了,
复制代码
  1. #include<stdio.h>
  2. int sumAndCha(int a,int b, int *cha,int *mul);
  3. int main(){
  4.     int *mul;
  5.     int  *cha;
  6.     int sum=sumAndCha(12,14,cha,mul);
  7.     printf("sum=%d,cha=%d\n,mul=%d",sum, *cha,*mul);
  8.     return 0;
  9. }

  10. int sumAndCha(int a,int b, int *cha,int *mul){
  11.     int sum =0;
  12.     sum=a+b;
  13.     *mul=a*b;
  14.     *cha= a-b;
  15.     return sum;
  16. }
复制代码

会报经典错误,Segmentation fault: 11
求解释。。。。。


作者: 蜡笔3285    时间: 2015-2-15 08:39
① 你这个问题,我仔细研究了一下,报的是指针为空的错误,你给指针付一个初始变量地址就不会报错了.
② 如果你检查一下两个指针指向变量的地址&*p,你会发现,第二个变量的地址为0x0,这应该是编译器没给你自动分配。
③ 一个参数的情况下为什么不报错?我研究了下,编译器只会对他遇到的第一个野指针赋值。
以上是个人观点呀,你最好自己研究一下。
作者: Micro    时间: 2015-2-15 13:19
蜡笔3285 发表于 2015-2-15 08:39
① 你这个问题,我仔细研究了一下,报的是指针为空的错误,你给指针付一个初始变量地址就不会报错了.
② 如 ...

好的。我试一下。感谢。
作者: Micro    时间: 2015-2-15 13:24
蜡笔3285 发表于 2015-2-15 08:39
① 你这个问题,我仔细研究了一下,报的是指针为空的错误,你给指针付一个初始变量地址就不会报错了.
② 如 ...
  1. #include<stdio.h>
  2. int sumAndCha(int a,int b, int *cha,int *mul);
  3. int main(){
  4.     int *mul=0;
  5.     int  *cha=0;
  6.     int sum=sumAndCha(12,14,cha,mul);
  7.     printf("sum=%d,cha=%d\n,mul=%d",sum, *cha,*mul);
  8.     return 0;
  9. }

  10. int sumAndCha(int a,int b, int *cha,int *mul){
  11.     *cha=0;
  12.     *mul=0;
  13.     int sum =0;
  14.     sum=a+b;
  15.     *mul=a*b;
  16.     *cha= a-b;
  17.     return sum;
  18. }
复制代码


还是不行呀。。。。。
作者: 蜡笔3285    时间: 2015-2-15 13:56
本帖最后由 蜡笔3285 于 2015-2-15 14:03 编辑
Micro 发表于 2015-2-15 13:24
还是不行呀。。。。。
  1. #include<stdio.h>
  2. int sumAndCha(int a,int b, int *cha,int *mul);
  3. int main(){
  4.     int a;
  5.     int b;
  6.    
  7.     int *mul=&a;
  8.     int  *cha=&b;
  9.     int sum=sumAndCha(12,14,cha,mul);
  10.     printf("sum=%d,cha=%d\n,mul=%d",sum, *cha,*mul);
  11.     return 0;
  12. }

  13. int sumAndCha(int a,int b, int *cha,int *mul){
  14.     int sum =0;
  15.     sum=a+b;
  16.     *mul=a*b;
  17.     *cha= a-b;
  18.     return sum;
  19. }
复制代码

作者: 蜡笔3285    时间: 2015-2-15 13:57
给他赋地址,不是赋值为0.
作者: 恋梦    时间: 2015-2-15 14:46
本帖最后由 恋梦 于 2015-2-15 14:49 编辑
  1. #include <stdio.h>

  2. int sumAndCha(int a,int b, int *cha,int *mul);
  3. int main(){
  4.     int mul;
  5.     int cha;
  6.     int sum=sumAndCha(12,14,&cha,&mul);
  7.     printf("sum=%d\ncha=%d\nmul=%d\n",sum, cha, mul);
  8.     return 0;
  9. }

  10. int sumAndCha(int a,int b, int *cha,int *mul){
  11.     int sum = 0;
  12.     sum= a + b;
  13.     *mul = a * b;
  14.     *cha=  a - b;
  15.     return sum;
  16. }
复制代码

作者: clairetoto2012    时间: 2015-2-15 15:41
指针是经典啊!
作者: sun397721060    时间: 2015-2-15 19:41
不用给指针初始化
int ys(int q,int w,int *jian1,int *cheng1,int *chu1)
{
    *chu1=q/w;
    *cheng1=q*w;
    *jian1=q-w;
    return q+w;
}

int main()                               //函数调用指针实现多个返回值  加  减  乘  除
{
    int a=64;
    int b=4;
    int j;
    int jian;
    int cheng;
    int chu;
   
    j=ys(a,b,&jian,&cheng,&chu);
   
    printf("%d+%d=%d\n",a,b,j);
    printf("%d-%d=%d\n",a,b,jian);
    printf("%d*%d=%d\n",a,b,cheng);
    printf("%d/%d=%d\n",a,b,chu);
   
    return 0;
}
作者: Micro    时间: 2015-2-15 20:36
sun397721060 发表于 2015-2-15 19:41
不用给指针初始化
int ys(int q,int w,int *jian1,int *cheng1,int *chu1)
{

这个方法简单粗爆实用呀
作者: 吴浩友    时间: 2015-2-15 20:43
对了吧???
作者: 依然卟懂    时间: 2015-2-15 20:58
好难啊啊:'(




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2