我需要帮助尝试理解有关结构和指针的这段代码

时间:2016-03-11 14:42:39

标签: c pointers structure

我一直试图解决" MIME类型"来自此网站的拼图:https://www.codingame.com/games/puzzles/

我在以下网站上找到了这个难题的答案: http://ethiery.vvv.enseirb-matmeca.fr/CGsolo/mime-type.html

  1. 有人可以解释上面链接中p = d.elmts+i;(第49行)的内容吗?
  2. 当我省略第49行并在后续行中使用此代码时,为什么它不起作用? (直到我尝试使用d.elmts [i] .ext / mime打印ext和mimes时才显示错误)。当我使用p = d.elmts+i;时,它就像一个魅力。 (第一次使用stackoverflow。我不确定这是否会显示为代码段。如果不是,请道歉
  3. 代码

    d.elmts[i].ext = malloc(11*sizeof(char));
    d.elmts[i].mime = malloc(51*sizeof(char));
    scanf("%s %s\n",d.elmts[i].ext, d.elmts[i].mime);
    

2 个答案:

答案 0 :(得分:0)

elmts是数据类型对。

IN()

此表达式仅基于i将下一对分配给p。指针将从elmts(指针算术)移动到sizeof(pair)* i。

该对包含以下2个指针成员,您需要在使用它们之前分配内存。这就是接下来的两行。

char * ext; char * mime;

如果没有移动指针,它将指向同一对。

“p = d.elmts + i”的等效数组表达式是

p = d.elmts+i;

答案 1 :(得分:0)

  1. p是指向结构的指针 - 这意味着p'保存'内存中结构的起始地址 - 因此:对于当前结构(i表示地址偏移),p = d.elmts + i表示存储器中的起始地址。 在该示例中,已经为“dictSize”结构(即结构的数量)分配了存储器。 注意,结构的存储器是连续分配的(即彼此相邻),因此可以使用保留存储器的起始地址(即d.elemts)和一些偏移量(即i

  2. )轻松访问。
  3. 如果声明了一个指向结构的指针,那么当使用箭头符号时,指针只能访问底层结构成员。 如果声明了一个结构(不是指向结构的指针),那么可以使用点表示法访问底层结构成员。

  4. 在C中使用'[]'表示法可能被解释为尝试分配实际值(已分配的内存) - 而第50行和第51行中使用的指针表示法只是启​​用分配内存即指向正在分配的内存的起始地址 - 保存每个成员可能假设的可能值,即尚未将值放入此内存中 - 必须先创建/分配内存。