在家庭作业项目中,我必须从另一个指针中减去一个指针的地址。 这是我尝试编写的一段代码,用于从给定的元数据地址中减去void *类型的堆。这在某个地方是错的。
metadata_t* getBuddy(metadata_t* ptr)
{
metadata_t* offset = ptr - (char)heap;
int h = (char)heap;
#ifdef DEBUG
printf("ptr : %p\n", ptr);
printf("heap : %p\n", heap);
printf("offset: %p\n", offset);
printf("char : %d\n", h);
#endif
return NULL;
}
以下是我得到的输出:
ptr : 0x7fe7b3802440
heap : 0x7fe7b3802200
offset: 0x7fe7b3802440
char : 0
这是输出I EXPECTED:
ptr : 0x7fe7b3802440
heap : 0x7fe7b3802200
offset: 0x000000000240
char : 0x7fe7b3802200
问题:
1)为什么char输出为零? (这不是我正在做的事情:用单个字节转换指针,然后将其存储到int中)
2)如果这不是你如何正确地进行指针运算,你还会如何完成偏移?
编辑:
1)我认为堆被定义为int *。这是返回其值的给定代码段。
#define HEAP_SIZE 0x2000
void *my_sbrk(int increment) {
static char *fake_heap = NULL;
static int current_top_of_heap = 0;
void *ret_val;
if(fake_heap == NULL){
if((fake_heap = calloc(HEAP_SIZE, 1)) == NULL) {
return (void*)-1;
}
}
ret_val=current_top_of_heap+fake_heap;
if ((current_top_of_heap + increment > HEAP_SIZE)
|| (current_top_of_heap+increment < 0)) {
errno=ENOMEM;
return (void*)-1;
}
current_top_of_heap += increment;
return ret_val;
}
答案 0 :(得分:0)
指针算法仅对特定类型有意义。在此示例中,int类型的大小为4,但指针减法仅为1.
#include <stdio.h>
int array[2];
int *a, *b;
int main(void){
a = &array [0];
b = &array [1];
printf ("Int size = %d\n", sizeof(int));
printf ("Pointer difference = %d\n", b-a);
return 0;
}
节目输出:
Int size = 4
Pointer difference = 1
答案 1 :(得分:-1)
指针算术不支持操作(指针+指针)。允许的唯一操作是(Pointer + Integer),因此结果是一个指针。
要获得偏移量,您需要将两个指针都转换为整数类型。结果值是整数而不是指针。
示例:
int offset = (int)ptr - (int)heap;
printf("ptr : %p\n", ptr);
printf("heap : %p\n", heap);
printf("offset: %d\n", offset);
同样,heap
的值太大而无法存储在单个字节中,这就是为什么将其转换为char
类型会返回零值。