Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 检查整数和字符数组的内存时字节顺序不一致_C_Gdb_Endianness - Fatal编程技术网

C 检查整数和字符数组的内存时字节顺序不一致

C 检查整数和字符数组的内存时字节顺序不一致,c,gdb,endianness,C,Gdb,Endianness,在little endian机器上,我试图使用GDB检查以下变量的内存 int main() { char buffer[4] = "1234"; int value = 0x31323334; //ascii - "1 2 3 4" retun 0; } 我期望看到的是: 对于缓冲区变量-0x34333231 对于值变量-0x34333231 但是,GDB检查输出为: (gdb) show endian The target endi

little endian机器上,我试图使用GDB检查以下变量的内存

int main()
{
      char buffer[4] = "1234";
      int value = 0x31323334;
          //ascii - "1 2 3 4"

      retun 0;
}
我期望看到的是:

对于缓冲区变量-0x34333231 对于值变量-0x34333231

但是,GDB检查输出为:

(gdb) show endian
The target endianness is set automatically (currently little endian)

(gdb) x/w &value 
0x7fffffffe440: 0x31323334
(gdb) x/w buffer
0x7fffffffe444: 0x34333231
为什么在内存中存储int和char数组数据有区别?
看起来值变量存储为big-endian,我缺少什么吗?

变量
buffer
是四个字节

+------+------+------+------+ | 0x31 | 0x32 | 0x33 | 0x34 | +------+------+------+------+ ^ ^ | | Low address High address +------+------+------+------+ | 0x34 | 0x33 | 0x32 | 0x31 | +------+------+------+------+ ^ ^ | | Low address High address
并且
x
命令以本机字节顺序显示(在您的例子中是小的endian),导致您得到输出。

变量
buffer
是四个字节

+------+------+------+------+ | 0x31 | 0x32 | 0x33 | 0x34 | +------+------+------+------+ ^ ^ | | Low address High address +------+------+------+------+ | 0x34 | 0x33 | 0x32 | 0x31 | +------+------+------+------+ ^ ^ | | Low address High address
并且
x
命令以本机字节顺序显示(在您的例子中是小的endian),导致您得到的输出。

哇,奇怪。。。这是有原因的吗?@sergeyrar是有原因的:
buffer
是一个数组,第一个元素总是位于内存中的最低地址。对于其他值,没有这样的固定规则(否则我们就不会有所有的endianness问题)。。。这是有原因的吗?@sergeyrar是有原因的:
buffer
是一个数组,第一个元素总是位于内存中的最低地址。对于其他值,没有这样的固定规则(否则我们就不会有所有的endianness问题)。1)
char
缓冲区通常用作以null结尾的字符串,您没有为文本字符串中隐含的终止符留出空间。2) 编译器使用您指定的“执行字符集”发出文本字符,并且每个“字符”可能不总是使用一个
char
。因此,忽略文字字符串的显式数组大小。您将看到调试器还显示空终止符,以及所选字符编码中的字节。1)
char
缓冲区通常用作以null结尾的字符串,您没有为文本字符串中隐含的终止符留出空间。2) 编译器使用您指定的“执行字符集”发出文本字符,并且每个“字符”可能不总是使用一个
char
。因此,忽略文字字符串的显式数组大小。您将看到调试器还显示空终止符,以及所选字符编码中的字节。