我有一个unsigned long数组,我期望每个数组元素(32位)为4个字节,如下所示:
unsigned long giantbuffer[1024];
然而,当我打印出我的数组元素的地址时,我得到:
printf("%X\n", &giantbuffer[0]); --> gives ab8470
printf("%X\n", &giantbuffer[1]); --> gives ab8478
另外,
sizeof(giantbuffer) gives 8192, and sizeof(giantbuffer[0]) gives 8.
每个数组元素是8个字节!这是依赖于系统架构还是某种东西的东西?我是C的新手,所以也许这是显而易见的事情?这会对我的指针运算造成严重破坏。我正在使用“ch”对我的语法等进行一些解释器命令行样式检查。也许这是该程序的一个问题?
答案 0 :(得分:4)
因为在您的环境中,sizeof unsigned long
是8个字节。指针算术取决于所指向的对象的类型:
int i = 10;
int *p_i = &i;
将p_i
递增1 - 将指针增加sizeof(int)
个字节。
char c = 10;
char *p_c = &i;
将p_c
递增1 - 将指针增加sizeof(char)
个字节,依此类推。
这是依赖于系统架构的东西吗?
是。它还取决于您的编译器以及架构是否为32/64位。
答案 1 :(得分:4)
如果您需要特定数量的字节用于数据类型,请不要使用unsigned long
之类的类型。相反,请查看stdint
header。
而不是:
unsigned long myvar = 0;
unsigned long mybuf[100];
你会这样做:
uint32_t myvar = 0;
uint32_t mybuf[100];
无论你走到哪里,你都会获得32位的值。
澄清:
根据您的系统架构,uint32_t
将typedef
添加到unsigned int
或unsigned long
。这通常通过使用预处理器宏来处理,如下所示:
#ifdef __x86_64__
typedef unsigned int uint32_t;
#else
typedef unsigned long uint32_t;
#endif