Я не могу вспомнить, где я нашел это решение, но вот как мне удалось загрузить определенный файл конфигурации exe:
ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = "EXECONFIG_PATH" };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
Ответьте на ваш вопрос в EDIT:
Когда вы это сделаете:
int tmp = 0;
int * tmpPtr = & tmp;
Mem :: Copy ((void *) tmpPtr, basepointer (), sizeof (int));
tmpPtr указывает на адрес переменной tmp
и находится в стеке . И обратите внимание, что «безопасная область», на которую указывает tmpPtr, имеет размер tmp
(который равен 4 на некоторых машинах и 2 на других). Если вы скопируете в tmpPtr больше байтов sizeof (int), вы рискуете разбить стек.
Когда вы сделаете это:
int * tmpPtr = 0;
Mem :: Copy ((void *) tmpPtr, basepointer (), sizeof (int));
Значение tmpPtr равно 0, поэтому вы получите ошибку сегмента . , который представляет собой механизм защиты памяти, предлагаемый операционной системой. Например, вам не разрешено записывать какой-либо виртуальный адрес размером менее 4 КБ.
Простые вопросы - это нормально, я думаю, хорошо известно, что SO предназначена для всех уровней, а не только для элиты.
В C нет null
(если вы сами не определитесь). Инициализация нулевым указателем может быть выполнена одним из следующих двух способов:
int *p = 0;
int *p = NULL;
Если вы разыменуете p
после этого, вы, вероятно, получите нарушение прав доступа (я считаю, что это неопределенное поведение в соответствии с стандарт, так что на самом деле может произойти все что угодно, вплоть до полного уничтожения Вселенной - он может даже продолжать работать нормально, но я бы не стал на это полагаться).
Чтобы получить указатель на действительное целое число, просто используйте:
int a = 7;
int *p = &a;
с использованием оператора адреса.
Повторите свое редактирование, это совсем не странно, вам просто нужно визуализировать его. Позволять' s Предположим, что все переменные создаются, начиная с ячейки памяти 100, а целые числа и указатели имеют длину 4 байта. Разбивая ваши две ситуации до их простейшей формы:
int x = 2;
int *px = 0; int *px = &x;
+-----+ +-----+
px(100): | 0 | x(100) | 2 |
+-----+ +-----+
px(104) | 100 |
+-----+
Затем вы выполняете команду
*px = 7;
, пытаясь изменить переменную, на которую указывает px
.
С левой стороны вы попытается записать значение 7 в ячейку памяти 0. Это плохо; очень немногие системы позволят вам сделать это без сбоев, еще меньшее - без каких-либо побочных эффектов (некоторые версии HP-UX действительно работали нормально).
Справа указано то, что должно ] случиться. Значение, взятое из пикселей
, равно 100, поэтому значение 7 записывается в эту ячейку памяти, изменяя x
, как задумано.
Я часто нахожу изображения (даже примитивные художественные ASCII , так как я' m no Rubens или Botticelli) помогают прояснить концепции. Надеюсь, вам это немного прояснилось.
Вы можете сделать это любым из этих способов, кроме NULL, а не NULL. Я предпочитаю int * p = 0; over int * p = NULL;
Чтобы устранить некоторую путаницу, я чувствую, устанавливаю int * p = 0 или устанавливаю MyObject * p = 0; приводит к тому же результату ... нулевой указатель, который обычно приводит к сбою вашей программы, если вы пытаетесь разыменовать ее, хотя технически это неопределенное поведение. Пример, который у вас есть на C, отличается от других, потому что вы фактически устанавливаете указатель так, чтобы он указывал на целое число, установленное как 0.
int *pNull = 0; int c = *pNull; // Undefined behavior. Most likely crashing your program! int a = 0; int *pInt = &a; int x = *pInt; // x equals 0 a = 10; int y = *pInt; // y equals 10
В C нет ключевого слова null
(по крайней мере, в ANSI C99). Вы можете использовать a) или c).
В c) вы не инициализируете указатель нулевым значением, вы инициализируете его адресом локальной переменной.
Строка
int *tmpPtr = 0;
инициализирует значение указателя равным 0, поэтому tmpPtr указывает «никуда»; т.е. недействительная ячейка памяти. Вы должны сначала назначить указателю действительную ячейку памяти, как вы это сделали в предыдущем фрагменте.
Инициализируйте указатели, которые ни на что не указывают, с помощью константы нулевого указателя. Любые константные выражения со значением 0 служат константой нулевого указателя. В C макрос NULL используется по соглашению.