为什么我的无符号长数组指针增加8个字节而不是4个?

时间:2013-10-30 06:38:49

标签: c arrays long-integer sizeof

我有一个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”对我的语法等进行一些解释器命令行样式检查。也许这是该程序的一个问题?

2 个答案:

答案 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_ttypedef添加到unsigned intunsigned long。这通常通过使用预处理器宏来处理,如下所示:

#ifdef __x86_64__
typedef unsigned int uint32_t;
#else
typedef unsigned long uint32_t;
#endif