#include <stdio.h>
#include <malloc.h>
typedef struct _soft_array
{
int len;
int array[];//int array[0];
}SoftArray;
int main()
{
int i = 0;
SoftArray* sa = (SoftArray*)malloc(sizeof(SoftArray) + sizeof(int) * 10);
sa->len = 10;
for(i=0; i<sa->len; i++)
{
sa->array[i] = i + 1;
}
for(i=0; i<sa->len; i++)
{
printf("%d\n", sa->array[i]);
}
free(sa);
return 0;
}
我使用gdb打印sa-> array的数组,然后使我感到困惑:
(gdb) p sa->array
$1 = 0x602014
(gdb) p *sa->array@10
$2 = {[0] = 1, [1] = 2, [2] = 3, [3] = 4, [4] = 5, [5] = 6, [6] = 7, [7] = 8, [8] = 9, [9] = 10}
(gdb) p sizeof(int)
$3 = 4
(gdb) p *(char *)0x602014@40
$4 = "\001\000\000\000\002\000\000\000\003\000\000\000\004\000\000\000\005\000\000\000\006\000\000\000\a\000\000\000\b\000\000\000\t\000\000\000\n\000\000"
(gdb)
第一种方法运行良好(我在.gdbinit中添加了set print array-indexes)。
sizeof(int)== 4,然后我使用p *(char *)0x602014 @ 40,由于我的计算机是低位字节序,所以1显示为01 00 00 00。
当显示7时,输出变为?
这是怎么发生的,或者我错过了什么?
答案 0 :(得分:2)
请注意,输出的不是字符'a'
,而是'\a'
。这是ASCII中的警报字符。就像您稍后获得'\b'
,'\t'
和'\n'
来获得这些字符的ASCII等效内容一样。
This character escape reference包含所有标准C转义字符及其ASCII编码值的列表。