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

Why does my pointer for an unsigned long array increment by 8 bytes instead of four?

本问题已经有最佳答案,请猛点这里访问。

我有一个无符号长数组,我希望每个数组元素有4个字节(32位),如下所示:

1
unsigned long giantbuffer[1024];

但是,当我打印出数组元素的地址时,我得到:

1
2
3
4
5
printf("%X
"
, &giantbuffer[0]);  --> gives ab8470

printf("%X
"
, &giantbuffer[1]);  --> gives ab8478

也,

1
sizeof(giantbuffer) gives 8192, and sizeof(giantbuffer[0]) gives 8.

每个数组元素8个字节!这是依赖于系统体系结构还是什么?我是C的新手,所以这可能是一件显而易见的事情?这严重破坏了我的指针算法。我正在使用"ch"对我的语法进行一些解释程序命令行样式的检查,等等。也许这是该程序的问题?


如果数据类型需要特定数量的字节,请不要使用像unsigned long这样的类型。相反,查看类似于stdint头的内容。

而不是:

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

你会这样做:

1
2
uint32_t myvar = 0;
uint32_t mybuf[100];

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

澄清:根据您的系统架构,uint32_ttypedef发送给unsigned intunsigned long。这通常通过使用预处理器宏来处理,如下所示:

1
2
3
4
5
#ifdef __x86_64__
typedef unsigned int uint32_t;
#else
typedef unsigned long uint32_t;
#endif

因为在您的环境中,unsigned long的大小是8字节。指针算法取决于要指向的对象的类型:

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

p_i增加1—用sizeof(int)字节增加指针。

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

p_c增加1—使用sizeof(char)字节增加指针,依此类推。

Is this something that is dependent on system architecture or something?

对。它还取决于编译器以及体系结构是否为32/64位。