Распределение памяти в C через указатели - PullRequest
2 голосов
/ 02 июня 2011

Я учусь использовать указатели, поэтому я написал приведенную ниже программу для назначения целочисленных значений в интервале [1100] для некоторых случайных мест в памяти.

Когда я читаю эти места в памяти, printf отображаетвсе значения, а затем дает мне ошибку сегментации.Это кажется странным поведением, потому что я надеялся увидеть либо все значения, либо ошибку сегмента, но не оба одновременно.

Может кто-нибудь объяснить, почему я увидел оба?

Спасибо.Вот код

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char first = 'f';
    char *ptr_first = &first;
    int i=1;
    for(i=1;i<101;i++)
        *(ptr_first+i) = i;
    for(i=1;i<101;i++)
        printf("%d\n", *(ptr_first+i));
    return EXIT_SUCCESS;
} 

Ответы [ 3 ]

5 голосов
/ 02 июня 2011

Не странно вообще.Вы используете вашу переменную first, которая находится в стеке.По сути, вы успешно перезаписываете стек (иначе известный по переполнению буфера в стеке) и, таким образом, вероятно, уничтожаете любой адрес возврата и т. Д.вызовет аварию.

2 голосов
/ 02 июня 2011

Вы обращаетесь к прошлой памяти за пределы назначенной first. Это всего лишь один символ, и с помощью указателя ptr_first вы получаете доступ к 100 позициям после этого символа в незарезервированной памяти. Это может привести к segfaults.

Вы должны убедиться, что исходная переменная имеет достаточно памяти, зарезервированной для доступа к указателю. Например:

char first[100];

Это сначала преобразует в массив из 100 символов (в основном это пространство памяти в 100 байт, к которому вы можете обращаться через указатель).

Обратите внимание, что вы вставляете int в указатель на символ. Это будет работать, но значение int будет усечено. Вы должны использовать char в качестве типа i.

0 голосов
/ 02 июня 2011

, поскольку указатель ptr_first сначала указывает на переменную типа char.Теперь, когда вы увеличиваете ptr_first, так что расположение адреса увеличенной памяти может быть вне адресного пространства памяти процесса, поэтому ядро ​​отправляет ошибку сегментации этому процессу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...