Почему указатель на область malloc не работает, если не скопирован? - PullRequest
0 голосов
/ 14 июля 2010

У меня есть указатель на структуру. Я вызываю подпрограмму, которая определяет, нужна ли мне эта структура, и выделяет для нее место с помощью malloc, возвращая указатель на эту область или ноль, если не используется.

struct node *node_p;
node_p = need_this();

Это работает, и я могу правильно получить доступ ко всем элементам структуры. Одним из элементов узла структуры является * next, который указывает на структуру следующего узла и указатель на строку, но он возвращает указатель на строку, которой даже нет в этой подпрограмме.

node_p=find_string(node_p->next,"string");

Однако это возвращает указатель в структуре на правильную строку.

struct node *node_p, *node_copy;
node_copy=find_string(node_p->next,"string");

Единственное отличие заключается в использовании второго указателя вместо оригинала. Я что-то здесь не так делаю или это должно быть глубже в вызываемой функции? Проблема с обвинением вызываемой функции в том, что я использую ее несколько раз в течение нескольких месяцев без проблем, однако другие вызовы только ищут строку и никогда не переходят к «следующему».

EDIT: Дальнейшая отладка показала, что проблема на самом деле заключается в том, что указатель передается в find_string, а не в возвращаемый указатель. Это меняет вопрос и проблему, поэтому мне нужно открыть другой вопрос.

Ответы [ 2 ]

2 голосов
/ 14 июля 2010

В этом фрагменте:

struct node *node_p, *node_copy;
node_copy=find_string(node_p->next,"string");

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

0 голосов
/ 14 июля 2010

Вам необходимо явно выделить память для каждой структуры, то есть выделить новую структуру и установить следующий указатель, указывающий на нее. Указатели на C до инициализации указывают на случайное место, и вам никогда не следует разыменовывать их. Безопасная политика состояла бы в том, чтобы инициализировать их как NULL.

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