在C:Bus错误10中通过引用传递双数组

时间:2012-11-06 02:39:52

标签: c

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

void setZero (double **, int);

int main (void) {
        double *ptr = NULL;
        int i, size = 3;
        ptr = (double *)malloc(size * sizeof(double));
//*
        setZero(&ptr, size);
/*/
        // Sanity test
        for ( i = 0 ; i < size ; ++i ) {
                printf("index %d/%d\n", i, (size-1));
                ptr[i] = 0;  // NOT EXPLODING...
        }
//*/
        free(ptr);
        return 0;
}

void setZero (double **_ref_array, int _size) {
    int i;

    for ( i = 0 ; i < _size; ++i ) {
        printf("index %d/%d\n", i, (_size-1));
        *_ref_array[i] = 0;  // EXPLODING...
    }
}

1)为什么这不起作用?

2)什么是“总线错误10”

P.S。我知道比以这种方式初始化数组更好,但这恰好是一个我不理解的基础概念的简单而干净的例子......

2 个答案:

答案 0 :(得分:3)

取消引用发生在索引之后。即。

这表示“在索引'i'处获取双指针,然后将值0设置为该指针内地址处的内存。”

*_ref_array[i] = 0; 

这说“从_ref_array获取双打数组的地址,而不是通过i-double索引该地址。

(*_ref_array)[i] = 0;

答案 1 :(得分:2)

在给定代码的表面上,您不需要将指针的地址传递给函数。你应该使用:

void setZero(double *ptr, int size)
{
    for (int i = 0; i < size; i++)
        ptr[i] = 0.0;
}

setZero(ptr, size);

你遇到的问题是WhozCraig说:

*_array_ref[i]

被解释为:

*(_array_ref[i])

而不是:

(*_array_ref)[i]

因为你需要它。前者正在践踏堆栈;后者正在初始化分配的内存。

如果你真的必须传递指向函数的指针,那么你可以在解引用周围包括括号,或者你可以分配一个本地指针并正常使用它,直到你需要使用的点双指针改变调用函数中的值。

void setZero(double **ptr, int size)
{
    double *base = *ptr;
    for (int i = 0; i < size; i++)
    {
        base[i] = 0.0;
        // Or: (*ptr)[i] = 0.0;
    }
    ...presumably some code here needs to assign to *ptr...
    ...if there is no such code, there is no need of the double pointer...
}