【问题标题】:C struct pointer iterationC结构指针迭代
【发布时间】:2011-10-01 16:38:33
【问题描述】:

我没想到能够在结构的内存块中增加指向结构的指针。但它似乎工作。有没有这不起作用的情况?如果我创建一个结构“列表”,那么我应该总是能够增加指向它们的指针,C 会计算出要移动多少字节?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct User {
    int id;
    char name[32];
    float net_worth;
};
typedef struct User User;


int main(int argc, char** argv) {
    User* u1 = (User*)malloc(sizeof(User));
    u1->id = 1;
    strcpy(u1->name, "Mike");
    u1->net_worth = 43.45;
    User* u2 = (User*)malloc(sizeof(User));
    u2->id = 2;
    strcpy(u2->name, "Pablo");
    u2->net_worth = -2.00;
    User* u3 = (User*)malloc(sizeof(User));
    u3->id = 3;
    strcpy(u3->name, "Frederick");
    u3->net_worth = 7329213.45;

    User** users = (User**)malloc(sizeof(User)*10);
    *users = u1;
    printf("%s\n", ((User*)(*users))->name);
    *users++;
    *users = u2;
    printf("%s\n", ((User*)(*users))->name);
    *users++;
    *users = u3;
    printf("%s\n", ((User*)(*users))->name);


    return 0;

}

【问题讨论】:

  • 究竟是什么问题,你看它工作正常吗?
  • 是的,我只是想确保我没有遗漏任何东西并且我理解它。
  • 您使用表达式*users++的任何特殊原因? '*' 是多余的(它只是取消引用 ++ 的结果)。这也令人困惑,因为您似乎试图增加 *users,而不是 users 本身。
  • 我实际上是要指出这一点,users++ 就足够了。
  • 演员((User*)(*users)) 也是多余的。 usersUser**;因此(*users) 已经是User*

标签: c memory pointers struct iteration


【解决方案1】:

这在很大程度上是设计使然。假设你有

User userArray[16];

您可以通过userArray[1]*(userArray + 1) 访问第二个用户,或者获取指向第一个元素的指针并通过++ 递增它。

【讨论】:

    【解决方案2】:

    很简单:是的。这就是指针有类型的原因。

    【讨论】:

    • 我无法发表带有“yes”字样的评论,因为它需要 15 个字符
    【解决方案3】:

    是的,这就是它的工作方式。将 1 加到数组中的指针实际上会前进到下一个元素(C 会将内存地址调整为正确的数量,即结构的大小)。

    只有当你走得太远时这不起作用。仅当指针指向数组内或(仅用于算术)超出数组时,指针才有效(用于解除引用和指针算术)。所以:

    int x[10];
    int *px = &(x[9]);  // Points to last element, okay to dereference.
    px++;               // Points one beyond, still okay for aritmetic.
    px++;               // Don't use this for anything.
    

    如果您之后尝试使用指针,则会被视为未定义行为。

    【讨论】:

    • 只是一个 FIY:可以有一个指向末尾的指针(并使用该指针进行指针运算),但不能取消引用它。
    • 第二个 FIY:你可能会写 x + 9 而不是 &(x[9])(x 也有 int* 类型)。
    • @jforberg,像我们这样经验丰富的代码猴子可能会意识到没有区别,但我从教学经验中发现,初学者更容易理解“元素编号 9 的地址”而不是“将 9 添加到数组” .
    【解决方案4】:

    是的。

    (填写 30 个字符的帖子要求的文本)

    【讨论】:

      【解决方案5】:

      C 会计算出要移动多少字节?

      是的。这就是为什么 C 对可以放入结构的内容施加限制的原因:给定类型的结构的每个实例都必须具有相同的大小,并且编译器必须能够在编译时计算出该大小, 让这个方案生效。

      【讨论】:

        猜你喜欢
        • 2018-09-04
        • 1970-01-01
        • 2021-05-03
        • 2021-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-14
        • 1970-01-01
        相关资源
        最近更新 更多