c - 在 C 中使一个指针指向另一个指针所指向的内容

标签 c math memory pointers struct

我无法在标题中真正描述我的问题,但基本上我需要一些指针算术方面的帮助。假设您有一个如下所示的结构。然后你会得到一个指向内存结构中 long 后面的指针。假设指针是*p。所以我会做 p += sizeof(void *) 来获取下一个指针位置的 p 。现在我如何真正让 p 指向 next 所指向的内容,而不仅仅是让它指向内存中下一个指针的位置?

struct freeblock {
  long s; 
  // <--- THE POINTER WOULD BE POINTING HERE
  struct freeblock *prev;
  struct freeblock *next;
} 

最佳答案

这可能是一个棘手的问题。您确实不想在结构中进行指针算术。原因是Struct Alignment 。如果你有一个像这样的结构,会发生什么:

struct a{
  char x; //address 0x8
  //potentially 3 bytes lost here:
  int y; //address 0x12
}

y 不会在 x 之后的一个字节处开始。为了保持对齐,所以 y 从 4 的倍数的地址开始,在 x 之后会添加一些填充字节。

如果你有一个结构实例 0x08 的地址并添加一个 char 的大小,产生 (0x09),你将不会得到 y 0x12 的开头,你会得到一些垃圾数据,其中一部分是垃圾,一部分是 y。

在这种情况下,你应该没问题,因为相同的类型是一个接一个的,你可以这样做:

freeblock* p = s.prev;
p += sizeof(p);
freeblock next = *p;

您确实希望获得指向该结构的指针,并让编译器为您计算偏移量。

关于c - 在 C 中使一个指针指向另一个指针所指向的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5916152/

相关文章:

php - 累积数组

math - 如何为摆动的绳索制作动画?

c++ - 什么时候释放传递给 DirectX 的内存是安全的?

java - 栈帧占用的大小

c - 多处理器架构中的状态机事件生成

c - 从使用追加模式打开的文件中读取

c++ - 在 Visual Studio 中写入文件时出错

无限/重复世界的数学/计算与旋转

c - 使用 fopen 读取文件 : is a char** returned correctly?

c++ - C++中的对象大小是不可预测的