我正在尝试访问结构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
}
答案 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)。但是,访问该数组其他元素的最简洁的语法是使用索引运算符,而且值得一看。