#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。我知道比以这种方式初始化数组更好,但这恰好是一个我不理解的基础概念的简单而干净的例子......
答案 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...
}