【问题标题】:why is pointer to struct behaving like an array of structs为什么指向结构的指针表现得像结构数组
【发布时间】:2019-09-15 15:53:13
【问题描述】:

我有以下代码


typedef struct{
    int fildes;
    char key[MAX_KEYLEN];
} item_t;

static int nitems;
static item_t *items;
FILE *filelist;
    int capacity = 16;
    char *path, *ptr;

    if( NULL == (filelist = fopen(filename, "r"))){
        fprintf(stderr, "Unable to open file in content_init.\n");
        exit(EXIT_FAILURE);
    }

    items = (item_t*) malloc(capacity * sizeof(item_t));
    nitems = 0;
    while(fgets(items[nitems].key, MAX_KEYLEN, filelist)){
        /*Taking out EOL character*/
        items[nitems].key[strlen(items[nitems].key)-1] = '\0';
// and there's more code below which is not relevant to the question

在上面的代码中, Item_t 是一个结构体,定义如下

typedef struct{
    int fildes;
    char key[MAX_KEYLEN];
} item_t;

那么,items 被定义为
static item_t *items;

items 使用以下代码初始化
items = (item_t*) malloc(capacity * sizeof(item_t));

那么,下面就用items做完
fgets(items[nitems].key, MAX_KEYLEN, filelist)

items 应该是一个结构。怎么变成数组了?我说数组是因为,items[nitems] 正在完成 这让我觉得 items 是 item_t 结构的数组

【问题讨论】:

  • capacity 应该代表什么?如果您想要指向单个结构的指针,请使用 malloc(sizeof(item_t))
  • 在我看来,容量是数组中结构的数量

标签: c struct malloc


【解决方案1】:

指针和数组(在大多数情况下)可以互换使用。
array[i] 只是 *(array+i) 的语法糖。

【讨论】:

    【解决方案2】:

    回答您的问题“为什么指向结构的指针表现得像结构数组?” (下面的答案适用于任何数据类型,无论是结构还是其他数据类型)

    当您使用“N”个元素初始化一个数组(任何数据类型)时,您只是要求内存大小等于 (N * sizeof(data-type)),其基地址为数组中第一个元素的地址(即索引为零的元素)。

    因此,当您访问数组中的任何元素时,您实际上所做的是取消引用存储在内存中特定地址的值。

    示例:

    #define N 3
    int32_t array[N] = {11, 22, 33};
    

    假设现在我想打印数组中的最后一个元素(即索引 2 处的元素)。 由于我知道数组的基地址,我可以通过以下方式访问数组中的元素:

    printf("%d \n", array[2]);
    /***** OR *****/
    printf("%d \n", *(array + 2));
    

    注意:

    在第二个printf()从机器的角度来看发生了什么:

    *( 基地址 + 索引 * sizeof(data-type) )

    因为从机器的角度来看,数据类型、数组等的概念并不存在。 (简化解释,不涉及汇编级代码)

    注意:

    array[i] 只是*(array + i) 的语法糖

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 2012-12-07
      • 2016-06-20
      • 1970-01-01
      相关资源
      最近更新 更多