理解指向结构的指针

时间:2013-04-24 23:26:47

标签: c

我正在制作指向结构的指针结构。我一直在谷歌搜索疯狂,我无法弄清楚为什么下面的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?
}

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

首先,由于一些错误,您的代码无法编译。您需要先声明类型,然后才能在结构中使用它;并且您要声明一个全局变量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声明的返回类型和未使用的参数。我已经在上面解决了这些问题,因此它会在没有警告的情况下编译。