【问题标题】:Understanding pointers to structs理解指向结构的指针
【发布时间】:2023-03-16 15:11:01
【问题描述】:

我正在制作指向结构的指针结构。我一直像疯子一样在谷歌上搜索,我不明白为什么下面的 printf 语句给出了不同的内存地址。有人可以向我解释一下吗?

struct board_piece {
   board_piece* next;
   board_piece* prev;
} board_piece;

main (int argc, char *argv []) {

  board_piece *newPiece = malloc (sizeof (board_piece));
  board_piece *newPiece2 = malloc (sizeof (board_piece));
  newPiece->next = newPiece2;
  printf("%x, %x",  newPiece->next, newPiece2); //Why aren't these the same address?
}

【问题讨论】:

  • 乍一看,我同意你的看法。他们应该是一样的。此外,由于它们是动态分配的,我认为编译器不会优化它们。除了下面提到的 %p 选项之外,我建议您在调试器中查看您的值,看看它何时显示。
  • 您发布的代码无效。您定义了一个名为 struct board_piece 的类型,而不是 board_piece。您将board_piece 定义为对象名称,然后将其用作类型名称。 main 应定义为返回类型为int。您缺少<stdlib.h><stdio.h> 所需的#include 指令。请发布实际的复制粘贴代码。

标签: c


【解决方案1】:

尝试使用%p 作为您的格式说明符。您可能处于指针和整数大小不同的平台上。

【讨论】:

  • -1。即使指针和整数大小不同,打印的值也应该相同。
  • @Gonzalo:这取决于可变参数函数的调用约定。他可能看到的是 64 位指针的上半部分和下半部分。
  • 该死的。如何撤消-1? :)...完成!
  • %p 需要 void *。你应该投那个。
【解决方案2】:

首先,由于一些错误,您的代码无法编译。您需要先声明您的类型,然后才能在结构中使用它;你声明了一个全局变量board_piece,而不是一个类型,因为你没有使用typedef。您确定您正在运行的代码实际上是您认为的代码吗?

其次,正如 Ben Jackson 指出的那样,您应该将 %p 用于指针,因为指针可以比整数更宽。如果您使用表示整数的%x,并传入一个指针,printf() 可能会在错误的位置查找值。

以下对我有用,为两个指针打印出相同的值:

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

typedef struct board_piece board_piece;

struct board_piece {
   board_piece* next;
   board_piece* prev;
};

int main () {

  board_piece *newPiece = malloc (sizeof (board_piece));
  board_piece *newPiece2 = malloc (sizeof (board_piece));
  newPiece->next = newPiece2;
  printf("%p, %p",  newPiece->next, newPiece2); //Why aren't these the same address?

  return 0;
}

我建议编译时启用警告,并将其视为错误。如果你使用的是 GCC 或者 Clang,我一般推荐-Wall -Wextra -Werror; MSVC 可能有一组等效的选项。请注意,这样做时,您需要修复更多警告,例如没有为main 声明返回类型和未使用的参数。我已经在上面修复了这些问题,所以它编译时没有警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2012-03-28
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多