C 当指针指向时,无法使用箭头符号访问结构数据

C 当指针指向时,无法使用箭头符号访问结构数据,c,pointers,struct,C,Pointers,Struct,我已经创建了一个结构数组,并且遇到了一个错误的访问错误。当我把所有的东西都换成点符号时,效果很好,这是为什么 Struct typedef struct data{ int num; }data; Main int main(void){ // This works data data[4]; data[0].num = 10; printf("Number is = %d\n", data[0].num); // This does not work dat

我已经创建了一个结构数组,并且遇到了一个错误的访问错误。当我把所有的东西都换成点符号时,效果很好,这是为什么

Struct

typedef struct data{
    int num;
}data;
Main

int main(void){
  // This works
  data data[4];
  data[0].num = 10;
  printf("Number is = %d\n", data[0].num);

  // This does not work
  data *data[4];
  data[0]->num = 10;
  printf("Number is = %d\n", data[0]->num);
由于
data
是一个由四个指针组成的数组,
data[0]
是这四个指针中的第一个。但它指向什么呢?因为您没有做过类似于
data[0]=malloc(sizeof(struct data)),它没有特别指向任何东西--未初始化的垃圾。尝试写入指针指向的内容会导致错误的访问错误,这并不奇怪


在取消引用指针之前,您需要使指针实际指向某个对象。

箭头符号仅适用于指针。您不能使用此行创建对象
data*data[4]。这将创建一个指针数组。所以指针后面没有对象,它不能工作。远离原始数组和C++中的指针。通常你需要的是标准容器或动态内存管理(智能指针)。你是写C代码还是C++代码?使用这两个标签,很难提供高质量的答案。既然你被标记为C++,你就可以去掉<代码> TyPulf< /Cord>。您可以将变量声明为
数据[4]。我强烈建议对类型和变量使用不同的名称。在你的例子中,变量<代码>数据<代码>与结构>代码>数据< /代码>混淆。我不认为在C++ C++中回答一个问题是一个好主意。我想让答案简单明了,所以不想讨论这两种语言之间的差异。这很令人沮丧。我不能给出完美的C答案。我不能给出完美的C++答案。我不想在回答一个简单的问题时就两种语言之间的差异进行复杂的讨论,这可能会让OP感到困惑,因为OP很可能只使用一种语言写作。那么我能做什么呢?考虑到双重标签,你做了你能做的。拥有一个upvote。@RonanMacF它与符号无关,它与您创建的变量类型有关。如果您创建了一个
数据
s数组,那么您就有了一个
数据
,可以设置其
num
成员。如果创建一个指针数组,那么所有指针都是指针,没有数据。在第一种情况下,
(&data[0])->num=10
也可以工作,在第二种情况下,
(*data[0])。num=10也不起作用。
// This does not work
data *data[4];
data[0]->num = 10;
printf("Number is = %d\n", data[0]->num);