0
#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”

PS我知道最好不要以这种方式初始化数组,但这恰好是一个我不理解的基本概念的简单而干净的例子......

4

2 回答 2

3

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

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

*_ref_array[i] = 0; 

这表示“从 _ref_array 获取双精度数组的地址,而不是通过 i-doubles 索引该地址。

(*_ref_array)[i] = 0;
于 2012-11-06T02:48:32.893 回答
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...
}
于 2012-11-06T02:56:40.453 回答