1167 ptr = (void*)getcwd(cwd, MAX_PATH_LENGTH-1);
(gdb) n
1168 if (!ptr) {
(gdb) print ptr
$1 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) print &cwd
$2 = (char (*)[3500]) 0xbff2d96c
(gdb) print strlen(cwd)
$3 = 36
(gdb) print "%s",cwd
$4 = "/media/MMC-SD/partition1/aaaaaaaaaaa", '\0' <repeats 912 times>, "��O�001\000\000\000\000��027\000\000\000�3����EL鷠3�000��027\000\000\000\000\000\000\000\027\000\000\000\000��/�027\000\000\000�3����N����\230���鷠3�000��027\000\000\000\000\000\000\000��000\000\000\000\001\000\000\000��M鷠3����\000\000\000\000.\231�027��w\005\b\001\000"...
(gdb) print "%s", ptr
$5 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) Quit
Почему ptr печатает строку правильно, а cwd - нет; это также влияет на программу, и она вылетает, если я пытаюсь использовать cwd ...
[edit: оказывается, что сбой был вызван глупым переполнением буфера на этой var ... grr ... не gdb, но вопрос печати был все еще действителен]





ptr отображается как красиво отформатированная строка, а cwd как «байтовый буфер», вероятно, специфичен для gdb. В любом случае это не должно повлиять на ваше приложение; согласно man 3 getcwd, ptr должен указывать на cwd (или он должен иметь значение NULL, если произошла ошибка).
Можно ли использовать ptr без сбоя программы?
Какой тип cwd? Приведенный выше фрагмент кода нам об этом не говорит. Может случиться так, что ptr как void * обрабатывается gdb по-другому.
Причина того, что cwd печатается по-разному в gdb, заключается в том, что gdb знает, что ptr - это char * (я думаю) и что cwd - это массив длины 3500 (как показано в вашем выводе). Таким образом, при печати ptr он печатает значение указателя (и в качестве услуги также строку, на которую он указывает), а при печати cwd он печатает массив весь.
Я не вижу причин, по которым использование cwd вместо ptr может привести к проблемам, но мне нужно посмотреть код, чтобы убедиться.
Я согласен с mweerden. Пробуя что-то похожее на ваш код, я получаю:
(gdb) print cwd
$1 = "/media", '\0' <repeats 782 times>, "\016���" ...
(gdb) print (char*) cwd
$2 = 0xbfc8eb84 "/media"
из gdb, поэтому кажется, что, поскольку cwd был определен как char cwd[3500], gdb печатает весь массив, а если вы скажете gdb интерпретировать его как char*, он будет работать так, как вы ожидаете. Если ваше приложение вылетает, я предполагаю, что это из-за чего-то другого.
Кто-нибудь хочет отредактировать заголовок, чтобы он давал нам больше информации? У меня нет представителя, чтобы сделать это