在C中通过引用传递双数组:总线错误10 #包括 #包括 无效设置零(双**,整数); 内部主(空){ double*ptr=NULL; int i,大小=3; ptr=(双*)malloc(尺寸*尺寸(双)); //* 设置零(&ptr,大小); /*/ //健全测试 对于(i=0;i

在C中通过引用传递双数组:总线错误10 #包括 #包括 无效设置零(双**,整数); 内部主(空){ double*ptr=NULL; int i,大小=3; ptr=(双*)malloc(尺寸*尺寸(双)); //* 设置零(&ptr,大小); /*/ //健全测试 对于(i=0;i,c,C,1) 为什么这不起作用 2) 什么是“总线错误10” 顺便说一句,我知道用这种方式初始化数组比用这种方式初始化数组要好,但这恰好是一个简单明了的例子,说明了一个我不理解的基本概念…解引用发生在索引之后。即 这表示“在索引‘i’处获取双指针,然后将值0设置为该指针内地址处的内存。” 这表示“从_ref_数组中获取double数组的地址,然后通过i-double索引该地址 *_ref_array[i] = 0; 解引用发生在索引之后 这表示“在索引‘i’处获取双指针,然后将值0设置为该指针内地址

1) 为什么这不起作用

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


顺便说一句,我知道用这种方式初始化数组比用这种方式初始化数组要好,但这恰好是一个简单明了的例子,说明了一个我不理解的基本概念…

解引用发生在索引之后。即

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

这表示“从_ref_数组中获取double数组的地址,然后通过i-double索引该地址

*_ref_array[i] = 0; 

解引用发生在索引之后

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

这表示“从_ref_数组中获取double数组的地址,然后通过i-double索引该地址

*_ref_array[i] = 0; 

对于给定的代码,您不需要将指针的地址传递给函数。您应该使用:

(*_ref_array)[i] = 0;
你遇到的麻烦是:

被解释为:

*_array_ref[i]
而不是:

*(_array_ref[i])
就像你需要的那样。前者是在践踏堆栈;后者正在初始化分配的内存

如果确实必须传递指向函数指针的指针,则可以在解引用周围加括号,也可以指定一个本地指针并正常使用,直到需要使用双指针更改调用函数中的值为止

(*_array_ref)[i]
void setZero(双**ptr,整数大小)
{
双*基=*ptr;
对于(int i=0;i
在给定的代码表面,您不需要将指针的地址传递给函数。您应该使用:

(*_ref_array)[i] = 0;
你遇到的麻烦是:

被解释为:

*_array_ref[i]
而不是:

*(_array_ref[i])
就像你需要的那样。前者是在践踏堆栈;后者正在初始化分配的内存

如果确实必须传递指向函数指针的指针,则可以在解引用周围加括号,也可以指定一个本地指针并正常使用,直到需要使用双指针更改调用函数中的值为止

(*_array_ref)[i]
void setZero(双**ptr,整数大小)
{
双*基=*ptr;
对于(int i=0;i
奇怪,我知道,但幽默我们:试试(*\u ref\u array)[I]。谁是对的。这是一个运算符优先级的问题-在谷歌中搜索“C运算符优先级”可以得到一个表。@WhozCraig(+1)你得到了它,兄弟,我不敢相信我错过了它;总noob.:顺便说一句,不要用下划线来命名变量。它违反了标准。前导下划线是为您正在使用的实现保留的。@Zak.Odd,我知道,但请幽默我们:Try(*\u ref\u array)[I]。WhozCraig是对的。这是一个运算符优先级的问题-在谷歌中搜索“C运算符优先级”可以得到一个表。@WhozCraig(+1)你得到了它,兄弟,我不敢相信我错过了它;总noob.:顺便说一句,不要用下划线来命名变量。它违反了标准。前导下划线是为您正在使用的实现保留的。@Zak,“总线错误10”是怎么回事?这条消息到底是什么意思?@Zak通常我会说这是一个数据对齐问题,但在这种情况下,这可能是因为您正在离开阵列的末端。“总线错误10”是怎么回事?这条消息到底是什么意思?@Zak通常我会说这是一个数据对齐问题,但在这种情况下,这可能是因为您正在离开数组的末尾。上面的代码只是一个更复杂程序的简单表示,它有更多的要求和参数,并且确实需要通过引用传递数组(正如我在问题中所解释的)。AFAICS,如果
setZero()
函数分配了内存,或者需要调整分配,则该注释将是准确的(或者,如果需要将指向数组的指针存储的位置传递给其他函数,可能需要拉伸该点,以便释放数组后指针可以为空).否则,这是一个相当不可信的说法。我同意,乔纳森。我认为该函数中还有更多的功能,但除非它可能重新分配或释放内存(即有理由修改指针)我可能会像你上面所说的那样编写代码。如果没有其他原因,大多数普通工程师都会避免使用双重间接寻址,因为他们甚至不知道它的含义。我必须假设他这样做有一个未公开的原因,然后就这样做。是的,@WhozCraig完全正确。我只需要做一个简单的程序为了说明我所遇到的错误,不要试图在这里发布10K行代码。不要假设我只处理10行函数,在这方面你真的不应该这样做