GDB распечатать массив мягкого массива - PullRequest
0 голосов
/ 11 ноября 2018
#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)

первый метод прошел успешно (я добавил set-index-index для массива в .gdbinit).

sizeof (int) == 4, затем я использую p * (char *) 0x602014 @ 40, потому что мой компьютер имеет младший порядок ,, поэтому 1 дисплей с 01 00 00 00.

Когда на дисплее 7 вывод становится?

Как это происходит, или я что-то пропускаю?

1 Ответ

0 голосов
/ 11 ноября 2018

Обратите внимание, что выводом является не символ 'a', а '\a'.Это символ alert в ASCII .Так же, как вы позже получите '\b' и '\t' и '\n' для эквивалентов ASCII этих символов.

Эта escape-ссылка на символ содержит список всех стандартных escape-символов C,вместе с их значениями в кодировке ASCII.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...