1

我有一个无符号长数组,我希望每个数组元素(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”对我的语法等进行一些解释器命令行样式检查。也许这是那个程序的问题?

4

2 回答 2

4

因为在您的环境中,sizeofunsigned long是 8 个字节。指针运算取决于所指向对象的类型:

int i = 10;
int *p_i  = &i;

递增p_i1 - 以字节增加指针sizeof(int)

char c = 10;
char *p_c  = &i;

递增p_c1 - 以字节增加指针sizeof(char),依此类推。

这是依赖于系统架构的东西吗?

是的。它还取决于您的编译器以及架构是否为 32 / 64 位。

于 2013-10-30T06:41:09.593 回答
4

如果数据类型需要特定数量的字节,请不要使用unsigned long. 相反,请查看诸如stdintheader之类的内容。

代替:

unsigned long myvar = 0;
unsigned long mybuf[100];

你会这样做:

uint32_t myvar = 0;
uint32_t mybuf[100];

无论你走到哪里,你都会得到一个 32 位的值。

澄清:根据您的系统架构,uint32_t获取typedef'edunsigned intunsigned long. 这通常通过使用预处理器宏来处理,如下所示:

#ifdef __x86_64__
typedef unsigned int uint32_t;
#else
typedef unsigned long uint32_t;
#endif
于 2013-10-30T06:42:14.680 回答