良好的做法和内存泄漏

时间:2011-11-02 07:25:23

标签: c dynamic

int* difference (int *a, int *b){
    if (*a > *b){
    *a = *a - *b;
    }else{
        *a = *b - *a;
    }
    return a;
}

int main (){
    int *xp, *yp;
    int x, y;

    x = 9;
    y = 7;

    xp = &x;
    yp = &y;

    xp = difference (xp,yp);
    printf("xp value: %d\n", *xp);

    return 0;
}

由于某些原因,我需要我的程序对单维数组进行一些数学运算。我在这里发布了一个示例,因为我担心差异函数及其返回值。

这两个值都是指针,但我需要这样做,因为我无法确定哪些值更重要。我的做事方式是一种好的做法,还是有更好的方法解决这个问题?

2 个答案:

答案 0 :(得分:2)

就个人而言,我尽量避免指针,如果不是,总是检查空指针。在这种情况下,我会修改difference()

int difference (int a, int b){
    if (a > b){
       return a - b:
    return b - a;
}

使用这种新方法,您无需检查空值:

int* difference (int *a, int *b){
    if (a && b)
    {
        if (*a > *b){
           *a = *a - *b;
        }else{
           *a = *b - *a;
        }
        return a;
    }

    // and what must I do with null pointers???????
}

此外,在main函数中,您不需要从int:

创建指针
int main (){
    int x, y;

    x = 9;
    y = 7;

    x = sum (x, y);
    printf("xp value: %d\n", x);

    return 0;
}

在简历中,如果没有必要,请尽量避免使用指针,否则,请始终检查空值

答案 1 :(得分:0)

我不明白为什么你在这里使用指针。您的difference()函数始终将差异分配给*a,并始终返回a。您也可以只使用两个int参数并返回int - 这样可以正常工作。

实际上,即使您没有将difference()的返回值分配给任何内容,也会修改a指向的值。将返回值分配给作为a参数传递的同一指针变量是不必要的 - 您将其设置为已有的相同值。无论如何,通过a在函数中修改指向的内容。

非指针版本:

int difference(int a, int b)
{
  if (a > b)
    return a - b;
  else
    return b - a;
}

或者同样的事情,但更短:

int difference(int a, int b)
{
  return (a > b) ? (a - b) : (b - a);
}

然后代替

xp = difference(xp,yp);

你要用

x = difference(x,y);

或者xpyp

*xp = difference(*xp,*yp);

请记住,您不需要仅使用函数内部的值来创建函数参数指针。只有在想要修改函数外的变量时才需要指针,而不是通过为函数指定函数的返回值。由于您总是在这里修改一个变量,您只需将函数的返回值赋给它,而不是通过函数内的指针修改它。函数内部的所有东西都可以正常工作 - 作为参数传递的副本 - 它不需要指向原始变量的指针,而像int之类的简单类型传递指针而不仅仅是值,无论如何都会降低效率...虽然像大struct这样更大的类型,有时候传递指针会更好,即使你不是非常需要。