простая инициализация указателя

Я не могу вспомнить, где я нашел это решение, но вот как мне удалось загрузить определенный файл конфигурации exe:

ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = "EXECONFIG_PATH" };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
23
задан too honest for this site 12 March 2016 в 16:49
поделиться

6 ответов

Ответьте на ваш вопрос в 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 КБ.

6
ответ дан 29 November 2019 в 01:45
поделиться

Простые вопросы - это нормально, я думаю, хорошо известно, что 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) помогают прояснить концепции. Надеюсь, вам это немного прояснилось.

37
ответ дан 29 November 2019 в 01:45
поделиться

Вы можете сделать это любым из этих способов, кроме 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

1
ответ дан 29 November 2019 в 01:45
поделиться

В C нет ключевого слова null (по крайней мере, в ANSI C99). Вы можете использовать a) или c).

В c) вы не инициализируете указатель нулевым значением, вы инициализируете его адресом локальной переменной.

0
ответ дан 29 November 2019 в 01:45
поделиться

Строка

int *tmpPtr = 0;

инициализирует значение указателя равным 0, поэтому tmpPtr указывает «никуда»; т.е. недействительная ячейка памяти. Вы должны сначала назначить указателю действительную ячейку памяти, как вы это сделали в предыдущем фрагменте.

0
ответ дан 29 November 2019 в 01:45
поделиться

Инициализируйте указатели, которые ни на что не указывают, с помощью константы нулевого указателя. Любые константные выражения со значением 0 служат константой нулевого указателя. В C макрос NULL используется по соглашению.

1
ответ дан 29 November 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: