sizeof 的错误结果
Wrong result with sizeof
我遇到了一个非常奇怪的问题:
typedef struct s_mem_chunk
{
void *addr;
unsigned int size;
short is_alloc;
struct s_mem_chunk *prev;
} t_mem_chunk;
#include <stdio.h>
#include <stdlib.h>
int main()
{
t_mem_chunk *mem_chunk;
mem_chunk = malloc(sizeof(*mem_chunk));
mem_chunk->prev = 0;
printf("%x + %x = %x\n", mem_chunk->prev, sizeof(*mem_chunk), mem_chunk->prev + sizeof(*mem_chunk));
return 0;
}
所以这里的代码应该输出:
“0 + 18 = 18”
而是输出“0 + 18 = 240”
所以我想知道为什么,这可能是由我不知道的 ot 大小引起的...
我请求你的帮助,提前感谢你的时间,祝你晚上愉快! :D
您的程序调用了未定义的行为。
x
转换说明符需要一个 unsigned int
类型的参数,但 mem_chunk->prev
是一个指针值。与 mem_chunk->prev + sizeof(*mem_chunk)
相同,它不执行整数运算但执行指针运算并产生无效指针。
你误解了 0 + 18 = 240 这是正确的结果!
0 是 mem_chunk->prev
的值。
18 是你的结构的大小;请注意,这是六边形的。
你有指针算法,所以mem_chunk->prev + sizeof(*mem_chunk)
不是通常的0+18,而是假设的从0开始的数组的第19个元素的地址。所以 0x18*0x18=0x240 为六进制。在指针算术中,将一个数字加到一个指针上计算出一个移动; int
用作与指针的距离,距离的单位是指针指向的对象的类型。如果给一个int
指针加1,那么在...
之后计算内存地址一个int
你的情况:
mem_chunk->prev+1
不是 1
,而是 0x18
,mem_chunk->prev+2
不是 2
,而是 0x30
。
还要注意格式,对指针使用%p
,对sizeof which returns a long int
使用%lx
(C99中的%zx
)。
我遇到了一个非常奇怪的问题:
typedef struct s_mem_chunk
{
void *addr;
unsigned int size;
short is_alloc;
struct s_mem_chunk *prev;
} t_mem_chunk;
#include <stdio.h>
#include <stdlib.h>
int main()
{
t_mem_chunk *mem_chunk;
mem_chunk = malloc(sizeof(*mem_chunk));
mem_chunk->prev = 0;
printf("%x + %x = %x\n", mem_chunk->prev, sizeof(*mem_chunk), mem_chunk->prev + sizeof(*mem_chunk));
return 0;
}
所以这里的代码应该输出: “0 + 18 = 18” 而是输出“0 + 18 = 240”
所以我想知道为什么,这可能是由我不知道的 ot 大小引起的... 我请求你的帮助,提前感谢你的时间,祝你晚上愉快! :D
您的程序调用了未定义的行为。
x
转换说明符需要一个 unsigned int
类型的参数,但 mem_chunk->prev
是一个指针值。与 mem_chunk->prev + sizeof(*mem_chunk)
相同,它不执行整数运算但执行指针运算并产生无效指针。
你误解了 0 + 18 = 240 这是正确的结果!
0 是 mem_chunk->prev
的值。
18 是你的结构的大小;请注意,这是六边形的。
你有指针算法,所以mem_chunk->prev + sizeof(*mem_chunk)
不是通常的0+18,而是假设的从0开始的数组的第19个元素的地址。所以 0x18*0x18=0x240 为六进制。在指针算术中,将一个数字加到一个指针上计算出一个移动; int
用作与指针的距离,距离的单位是指针指向的对象的类型。如果给一个int
指针加1,那么在...
int
你的情况:
mem_chunk->prev+1
不是 1
,而是 0x18
,mem_chunk->prev+2
不是 2
,而是 0x30
。
还要注意格式,对指针使用%p
,对sizeof which returns a long int
使用%lx
(C99中的%zx
)。