C 理解指向结构的指针

C 理解指向结构的指针,c,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_

我正在制作指向结构的指针的结构。我一直像疯子一样在谷歌上搜索,我不明白为什么下面的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
作为格式说明符。您可能位于指针和整数大小不同的平台上。

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

首先,由于一些错误,您的代码无法编译。您需要先声明类型,然后才能在结构中使用它;您正在声明一个全局变量,
board\u-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;
}
#包括
#包括
类型定义结构板件板件;
结构板{
下一个是棋盘;
板件*prev;
};
int main(){
board_-piece*newPiece=malloc(尺寸(board_-piece));
board_-piece*newPiece2=malloc(尺寸(board_-piece));
新建件->下一个=新建件2;
printf(“%p,%p”,newPiece->next,newPiece2);//为什么这些地址不一样?
返回0;
}

我建议编译时启用警告,并将其视为错误。如果您使用的是GCC或Clang,我通常推荐
-Wall-Wextra-Werror
;MSVC可能会有一组等价的选项。请注意,在执行此操作时,您需要修复一些其他警告,例如为
main
声明的无返回类型和未使用的参数。我已经在上面修复了这些问题,因此它在编译时没有警告。

首先,由于一些错误,您的代码无法编译。您需要先声明类型,然后才能在结构中使用它;您正在声明一个全局变量,
board\u-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;
}
#包括
#包括
类型定义结构板件板件;
结构板{
下一个是棋盘;
板件*prev;
};
int main(){
board_-piece*newPiece=malloc(尺寸(board_-piece));
board_-piece*newPiece2=malloc(尺寸(board_-piece));
新建件->下一个=新建件2;
printf(“%p,%p”,newPiece->next,newPiece2);//为什么这些地址不一样?
返回0;
}

我建议编译时启用警告,并将其视为错误。如果您使用的是GCC或Clang,我通常推荐
-Wall-Wextra-Werror
;MSVC可能会有一组等价的选项。请注意,在执行此操作时,您需要修复一些其他警告,例如为
main
声明的无返回类型和未使用的参数。我已经解决了上面提到的问题,因此它在编译时没有任何警告。

乍一看可能是重复的,我同意你的看法。它们应该是一样的。另外,由于它们是动态分配的,我认为编译器不会对它们进行优化。除了下面提到的%p选项外,我建议您在调试器中查看您的值,看看它何时显示。您发布的代码无效。您定义了一个名为
struct board\u-piece
的类型,而不是
board\u-piece
。将
board\u-piece
定义为对象名,然后将其用作类型名
main
应使用返回类型
int
定义。您缺少
所需的
#include
指令。请张贴真实的副本和粘贴的代码。可能的副本乍一看,我同意你。它们应该是一样的。另外,由于它们是动态分配的,我认为编译器不会对它们进行优化。除了下面提到的%p选项外,我建议您在调试器中查看您的值,看看它何时显示。您发布的代码无效。您定义了一个名为
struct board\u-piece
的类型,而不是
board\u-piece
。将
board\u-piece
定义为对象名,然后将其用作类型名
main
应使用返回类型
int
定义。您缺少
所需的
#include
指令。请张贴实际副本和粘贴的代码。即使指针和整数的大小不同,打印的值也应该相同。@Gonzalo:这取决于变量函数的调用约定。他可能看到了64位指针的上半部分和下半部分。该死。如何撤消-1?:)。。。完成了<代码>%p要求
无效*
。你应该投那个。即使指针和整数的大小不同,打印的值也应该相同。@Gonzalo:这取决于变量函数的调用约定。他可能看到了64位指针的上半部分和下半部分。该死。如何撤消-1?:)。。。完成了<代码>%p要求
无效*
。你应该投那个。