在我的c申请中,我有以下声明:
typedef double mat[MAX_SIZE][MAX_SIZE];
我还有一个全局变量:
mat aaa;
在我想要执行以下操作的函数中:
void func2(mat ccc)
{
ccc = aaa;
}
void func1()
{
mat bbb;
func2(bbb);
bbb[1][2] = 3;
}
我希望func2()
bbb
之后的操作影响全局变量aaa
,但他们不会。{/ p>
有关为什么行为不符合我的预期的任何建议?
答案 0 :(得分:1)
您需要将bbb
作为指针并发送bbb
的地址。
void func1()
{
mat *bbb;
func2(&bbb);
(*bbb)[1][2] = 3;
}
并像这样编辑func2
:
void func2(mat **ccc){
*ccc=&aaa;
}
答案 1 :(得分:0)
您的类型mat
不是指针类型,它是一个数组。您无法在C中分配数组变量。解决问题的常用方法是使用指针:
void func1(void)
{
mat *bbb = &aaa;
(*bbb)[1][2] = 3;
}
答案 2 :(得分:0)
您的意思是,bbb[1][2] = 3;
将在aaa
完成?然后你必须这样做:
mat aaa;
mat* func2() {
return &aaa;
}
void func1() {
mat* bbb = func2();
(*bbb)[1][2] = 3;
}
答案 3 :(得分:0)
此代码中存在概念错误 - 数组表达式可能不是赋值的目标。如果你试着写
void func1(void)
{
mat bbb;
bbb = aaa;
bbb[1][2] = 3;
}
编译器会对表达式bbb = aaa
抛出一个诊断(gcc给出“赋值不兼容的类型”诊断,因为aaa
被转换为指针类型;更多内容见下文)。通过将bbb
传递给func2
,您尝试做的事情实际上是相同的,并且最终无法发挥作用。
让我们摆脱typedef,这样我们就能看到所涉及的实际类型
double aaa[MAX_SIZE][MAX_SIZE];
...
void func2(double (*ccc)[MAX_SIZE])
{
ccc = aaa;
}
void func1()
{
double bbb[MAX_SIZE][MAX_SIZE];
func2(bbb);
bbb[1][2] = 3;
}
除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则表达式为“N-element array of { {1}}“将被替换为类型为”T
的指针“的表达式,其值是数组的第一个元素的地址。当您致电T
时,表达式func2
会从bbb
MAX_SIZE
MAX_SIZE
数组double
数组转换为“指向MAX_SIZE
的指针数组double
“;因此ccc
声明为double (*ccc)[MAX_SIZE]
。
同样,在ccc = aaa
中的func2
行中,表达式aaa
已从类型double [MAX_SIZE][MAX_SIZE]
转换为double (*)[MAX_SIZE]
。
到目前为止,func2
是Kosher,因为ccc
是指针表达式,而不是数组表达式,因此允许赋值。 ccc
恰好是与bbb
完全不同的实体(它接收bbb
计算到的指针值的副本),因此写ccc
对bbb
没有影响bbb
。如果你试图通过将指针传递给void func2(double (*ccc)[MAX_SIZE][MAX_SIZE])
{
*ccc = aaa;
}
void func1(void)
{
double bbb[MAX_SIZE][MAX_SIZE];
func2(&bbb);
bbb[1][2] = 3;
}
来解决这个问题,就像这样:
*ccc = aaa
编译器会在*ccc
上抛出诊断,因为*ccc
具有数组类型,或者因为aaa
和aaa
的类型不兼容(请记住,{{ 1}}转换为指针表达式)。