2013-12-12 3 views
1

Я должен отображать содержимое n байтов, начиная с определенного адреса памяти, то есть: выход для 25 байт, так как 0x00004000 (сегментный текст в виртуальном пространстве) будет #include <stdio.h> #inclu (25 букв)Отображение содержимого байта, заданного по адресу

Моей идеей было назначить char *c указанному адресу, например: *c=address;, а затем printf("%s",c);. Для меня концептуально имеет смысл, и я знаю, что в некоторых случаях это приведет к ошибке сегментации, если адрес недействителен.

Однако я реализовал его, и он всегда вызывает ошибку сегментации. Я использую pmap <pid>, чтобы узнать, какие области могут отображаться (низкие области) этого процесса. Когда я говорю «области, которые могут отображаться», я имею в виду текстовые области (код).

Итак, что я делаю неправильно? глупо присвоить *c=address;?

+1

Вы хотите 'c = (char *) адрес', а не' * c = '. Вы хотите назначить указатель, а не объект, на который указывает. –

+0

Назначение действительно, но, вероятно, этот адрес не содержит строку (она должна заканчиваться символом '\ 0'). Кстати, попробовали ли вы запустить его с помощью GDB/valgrind, чтобы показать, какой из них дает вам ошибку сегментации? Вы уверены, что можете получить доступ к памяти по этому адресу? – Marco

+0

@Marco Не имеет значения, что находится по адресу. Он никогда не разыменовывается, и завершение 0 имеет значение только для строковых функций, обычно те, чьи имена начинаются с 'str'. –

ответ

3
char *c = address; 

for (int i = 0; i < n; i++) { 
    putchar(c[i]); 
} 

Ошибка в коде

иметь что-то вроде

char *c; 
*c = address; 

недействительна, потому что с является оборванным указателем (вы никогда не инициализируетесь его). Вы хотите, чтобы установить адрес, который cуказывает на к address: c = address

printf("%s",c); 

Вы не знаете, если с надлежащей строкой, то она может содержать мусор или не может быть ˝n˝ длина байта. Вот почему я использовал putchar

1

*c = address помещает значение address в память cуказывает в настоящее время. Это то, что делает *. Чтобы изменить, где c пунктов, используйте c = address.

Но все же это звучит как скорее, ах, субоптимальное программирование.

Смежные вопросы