C中指针管理不善

时间:2015-03-25 09:42:48

标签: c pointers

我有一个小问题,我想了解指针...... 编译时我发现了这个错误:

error: lvalue required as left operand of assignment

我的代码就是这个:

typedef struct _matrix_info
{
    unsigned int matrix[2][5][4];
}matrix_info_t;

static  matrix_info_t matrix_custom_policy = {....}
matrix_info_t* matrix_custom_get(void)
{
    return &matrix_custom_policy;
}


static matrix_info_t matrix_policy[3] =
{
    // Only the first 2 cases are initialized
    ........
}

main()
{
    .....

    // the third case is initialized here;
    &(matrix_policy[3]) = matrix_custom_get();
}

你知道我为什么会出现这个错误吗?我应该用memcpy而不是吗? 提前谢谢。

5 个答案:

答案 0 :(得分:2)

此表达式

 &(matrix_policy[3]) 

创建一个等同于表达式

的临时对象
matrix_policy + 3

反过来不是左值,可能不会被分配。

事实陈述

&(matrix_policy[3]) = matrix_custom_get();

可以像

一样重写
(matrix_policy +3 ) = matrix_custom_get();

当然是无效的陈述。

考虑到您在此语句中使用了错误索引,因为根据数组定义的索引的有效范围

static matrix_info_t matrix_policy[3] =
{
   //...
};

[0, 2]

您的意思是以下内容吗?

matrix_policy[2] = *matrix_custom_get();

答案 1 :(得分:1)

在main()函数中,你正在使用&运算符,它将返回变量的地址。赋值运算符左侧的对象应该能够保存您指定的值。不要使用&使用数组成员,因为它只代表地址而不是数组成员。

答案 2 :(得分:0)

matrix_policy是一个数组,并且数组元素的地址不能是C中可修改的左值,因此存在错误。

&(matrix_policy[3]) = matrix_custom_get();

但您可以在数组中存储值,如

matrix_policy[3] = <value>;

答案 3 :(得分:0)

&获取变量的地址。结果是“rvalue”,即可以出现在赋值右侧的只读值。 “左值”可能出现在作业的左侧,可以分配给它。您无法重新分配变量的地址。

您的matrix_custom_get会返回指向matrix_info_t的指针。您想使用自定义矩阵覆盖matrix_info_t的内容,因此您必须取消引用您获得的指针:

matrix_policy[2] = *matrix_custom_get();

请注意,正如Anton H指出的那样,您无法以三个条目的数组访问索引3处的项目。

答案 4 :(得分:0)

感谢您的回答和解释。

当然,索引错了[3],错字错误:)

所以现在我明白了,我不能改变地址而只改变价值。 来自M Ohem的解决方案工作正常,而且来自莫斯科的弗拉德通过解除引用指针。

非常感谢你。