指针作为函数参数的麻烦

时间:2014-11-02 20:45:11

标签: c function pointers

我创建了一个函数,它在C中执行欧几里德除法,并将商和余数作为函数参数。

代码清单1:

#include<stdio.h>
#include<stdlib.h>

void euclidean(int a, int b, int * q, int * r);

int main(int argc, char ** argv){

    int * q;
    int * r;

    euclidean(5,4, q, r);

    printf("q = %d, r = %d", *q, *r);

    return 0;
}

void euclidean(int a, int b, int * q, int * r){
    q = (int*)malloc(sizeof(int));
    r = (int*)malloc(sizeof(int));

    *q = a/b;
    *r = a % b;

    //printf("q = %d, r = %d", *q, *r); //this will show

    return;
}

代码清单2:

#include<stdio.h>
#include<stdlib.h>

void euclidean(int a, int b, int * q, int * r);

int main(int argc, char ** argv){

    int * q;
    int * r;

    euclidean(5,4, q, r);

    printf("q = %d, r = %d", *q, *r);

    return 0;
}


void euclidean(int a, int b, int * q, int * r)
{
  *q = a / b;
  *r = a % b;

  //printf("q = %d, r = %d", *q, *r); //this won't show 

  return;
}

两个版本都无效。我在Windows上编译并运行代码,程序在运行时被终止而不打印任何内容(即“q = 1,r = 4”)。我的猜测是如果我必须在linux上编译并运行它,终端会给我一个“分段错误”错误(不确定)。我真的不明白为什么它不起作用,尤其是代码清单1 。对于代码清单2 ,人们可以争辩说,由于操作的结果是在创建它们的函数内部的某种常量变量,所以它们不能保留在函数的末尾(我需要对此的确认)。感谢

3 个答案:

答案 0 :(得分:2)

保持简单,愚蠢(有这样的原则)。:)

#include<stdio.h>
#include<stdlib.h>

void euclidean(int a, int b, int * q, int * r);

int main(int argc, char ** argv){

    int q;
    int r;

    euclidean(5,4, &q, &r);

    printf("q = %d, r = %d", q, r);

    return 0;
}

void euclidean(int a, int b, int * q, int * r)
{
  *q = a / b;
  *r = a % b;
}

如果您确实要在函数中分配内存,那么代码将类似于

#include<stdio.h>
#include<stdlib.h>

void euclidean(int a, int b, int * *q, int * *r);

int main(int argc, char ** argv){

    int * q;
    int * r;

    euclidean(5,4, &q, &r);

    printf("q = %d, r = %d", *q, *r);

    free( q );
    free( r );

    return 0;
}

void euclidean(int a, int b, int * *q, int * *r){
    *q = (int*)malloc(sizeof(int));
    *r = (int*)malloc(sizeof(int));

    **q = a/b;
    **r = a % b;
}

答案 1 :(得分:1)

您想要的是传递引用,它允许被调用者修改调用者提供的对象。

由于C纯粹是按值传递,因此使用指针进行模拟:

调用者传递被调用者应修改的对象的地址,被调用者取消引用接收的指针以修改预期的目标。

#include<stdio.h>
#include<stdlib.h>

void euclidean(int a, int b, int * q, int * r)
{
  // Modify the target-objects q and r point to
  *q = a / b;
  *r = a % b;
}

int main() {
    int q, r; // Not pointers, the objects themselves!
    euclidean(5, 4, &q, &r); // Passing the addresses of q and r
    printf("q = %d, r = %d", q, r);
}

根本没有动态分配。

答案 2 :(得分:1)

您没有获得listing_2的值,因为: -

void euclidean(int a, int b, int * q, int * r)
{
  *q = a / b;      <<<<<<<<<<<<<<<<<
  *r = a % b;

  //printf("q = %d, r = %d", *q, *r); //this won't show 

  return;
}

你既没有为主,也没有在欧几里德为q,r分配内存。当您尝试将指针未初始化为任何东西时,您会收到错误。