我可以使用指向包含该结构的指针的结构的指针访问结构的成员

时间:2020-03-16 11:27:09

标签: c pointers struct

我正在尝试访问结构tCAN_MESSAGE中的成员。我认为可行的方法就像主要的第一个示例,即some_ptr->canMessage_ptr->value = 10;。但是我有一些别人写的代码,我看到的是那个人使用了some_ptr->canMessage_ptr[i].value;。有可能第一种方法吗?我们经常使用指向包含其他结构的指针的结构的指针(如下面的示例),但是我从未见过使用ptr1-> ptr2-> value吗?

typedef struct
{
     int value1;
     int value2;
     int value3;
     float value4;
}tCAN_MESSAGE;

typedef struct
{
     tCAN_MESSAGE *canMessage_ptr;
}tSOMETHING;

int main(void)
{
    tCAN_MESSATE var_canMessage;
    tSOMETHING var_something;

    tSOMETHING *some_ptr = &var_something;
    some_ptr->canMessage_ptr = &var_canMessage;


    some_ptr->canMessage_ptr->value1 = 10; //is this valid?

     //I have some code that are doing this, ant iterating trough it with a for:
    some_ptr->canMessage_ptr[i].value1; //Is this valid?

    return 0
}

2 个答案:

答案 0 :(得分:2)

这非常简单:每个指针在使用前必须设置为指向有效的内存位置。如果不是,则无法使用。您不能“将数据存储在指针内”。看到这个:

Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized pointer

您的代码均无效。 some_ptr未设置为指向任何地方,因此无法访问它,其成员也无法访问。同样,some_ptr->canMessage_ptr也没有指向任何地方。

答案 1 :(得分:1)

我正在尝试访问结构tCAN_MESSAGE中的成员。我什么 认为会奏效就像主要的第一个例子,即 some_ptr->canMessage_ptr->value = 10;。但是我有一些代码 有人写过,我看到的是那个人有 使用了some_ptr->canMessage_ptr[i].value;。是否有可能做到这一点 第一种方式?

表达式

some_ptr->canMessage_ptr[i].value

100%等同于

(*(some_ptr->canMessage_ptr + i)).value

,它相当于100%

(some_ptr->canMessage_ptr + i)->value

i为0 时,当然等于

some_ptr->canMessage_ptr->value

是的,只要有问题的索引为0,就可以使用some_ptr->canMessage_ptr->value。如果索引始终为 0,则按照您的建议链接箭头运算符是好的样式。否则,我会建议您在实践中看到的混合箭头和索引运算符。

我们正在使用指向结构的指针,其中包含指向 另一个结构(如下面的示例)经常出现,但是我从没看到过 使用ptr1->ptr2->value吗?

我倾向于怀疑您不完全了解自己的工作方式。形式some_ptr->canMessage_ptr[i].value的使用表明您的tSOMETHING类型包含一个指向可能包含许多tCAN_MESSAGE array 的第一个元素的指针,这是一个微妙的但重要区别。在那种情况下,是的,如上所示,您可以链接箭头运算符以访问此类数组的 first 元素(索引为0)。但是,访问该数组其他元素的最简洁的语法是使用索引运算符,而且值得一看。

相关问题