2016-07-25 3 views
-1

Я новичок в C; У меня больше знаний о знаниях с Java. Я хочу, чтобы попытаться искать значения в памяти с помощью указателяИтерация через память с помощью указателей

#include <stdio.h> 

void main(){ 

    int value = 10; 
    find(value); 
} 

void find(int value){ // will change this to return array of long or int depending on which is better 

int* intPointer; 

    for(int i = 40000; i < 40400 ; i+= 32){ /* not sure if i do it like this or another way, 
               * the starting value, ending value and condition 
               * is just for testing purpose */ 

     intPointer = (int*)i; 

     if(*intPointer == value){ 
      printf("found value"); //will actually be storing it to an array instead 
     } 
    } 
} 

Метод находки дает мне ошибку сегментации, скорее всего, потому что адрес не хранит INT значения. Есть ли способ узнать, какие данные типа хранятся в адресе памяти.

Есть ли лучший способ достичь аналогичной задачи? Пожалуйста, объясните и покажите. Фактическая программа не будет иметь int value = ??, вместо этого метод поиска будет использоваться только для получения массива адресов, который содержит это значение.

Также, что является лучшим типом для хранения адресов int или long?

+0

Вы можете вызывать * неопределенное поведение *. Результат будет зависеть от системы, и если адрес будет доступен для доступа к ОС, доступ к нему приведет к тому, что ваша программа будет убита ОС. Вы написали 'void main()', поэтому вы можете выполнить этот код в автономной среде, такой как микроконтроллеры (но 'printf()' там не поддерживается. Обратите внимание, что использование незаявленной функции в любом случае является плохим. – MikeCAT

+1

Вы получаете доступ к нераспределенной памяти: это неопределенное поведение в C/C++, поэтому вы не можете проверить память таким образом. Кстати, размер int зависит от реализации: вы должны использовать 'sizeof (int) * 8' вместо 32 для увеличения вашего цикла. Почему вы хотите сделать это в первый раз? Возможно, мы могли бы предложить вам другой способ. – wasthishelpful

+0

Лучшим типом для хранения адресов является указатель (соответствующему типу). 'int' и' long' могут иметь или не иметь совместимых представлений и соответствующих размеров. – Dmitri

ответ

0

Вы подделываете указатель с временным var внутри цикла. Правильный способ поиска значения состоит в том, чтобы иметь два аргумента: значение для поиска и коллекцию (например, массив), содержащий некоторые значения для поиска.

1

Невозможно сделать то, что вы пытаетесь использовать в общем переносном режиме. Код генерирует неопределенное поведение при доступе к памяти, не выделенной вам.

В простых встроенных системах это возможно. Прежде всего, это потребует полного понимания структуры системной памяти и того, как работает компилятор. Например, вы должны знать, всегда ли int 4 байт выровнены в памяти, начальный/конечный адрес ОЗУ. Если MMU присутствует и активен, вам также нужно знать, как он работает.

Есть ли способ узнать, какие данные хранятся в памяти.

Нет

2

Пару вещей, чтобы знать, с места в карьер:

  1. памяти не всегда гарантированно физически непрерывными (даже если модель памяти, как представляется, как таковой).
  2. Knowing what a segfault is было бы полезно, а также то, что segmented memory и memory protection в общем
метод

находку дает мне ошибку сегментации, скорее всего, потому что адрес не хранит INT значение,

Из того, что я могу сказать, вы пытаетесь перебрать адреса памяти и найти определенное значение. Технически это возможно, но практически нет оснований для этого, кроме нескольких редких случаев.

К сожалению (для ваших целей) ваша операционная система по выбору управляет памятью довольно разумно; вместо того, чтобы просто разместить все, что он задан в линейном порядке, он делит (или 10 сегментов) память на свои собственные адресные пространства, чтобы память процесса A мешала памяти процесса B и т. д. Чтобы отслеживать, какие процессы находятся в памяти, используется механизм отображения.

Вы пытались получить доступ к памяти за пределами выделенного сегмента вашей программы. Чтобы иметь возможность делать то, что вам кажется, вам нужно будет найти способ получить карту памяти из ОС.

есть способ, которым я могу узнать, что тип данных хранится в памяти адреса

No, по крайней мере, не так, как вы хотите. A couple SO answers address this.