2010-07-14 1 views
-1

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

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

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, а не возвращенный указатель. Это меняет вопрос и проблему, поэтому мне нужно открыть другой вопрос.
+0

Звучит странно. 'find_string' должен возвращать' struct node * ', но вы говорите о возврате указателя на строку. Может быть, вы должны показать нам 'find_string', проблема, кажется, внутри этого. – Secure

+0

... он должен быть таким же ... как вы проверяете, правильно это или нет? вы получаете доступ к 'node_p' или' node_copy' во втором образце? единственная разница заключается в том, что 'node_p' не разбивается ... – ShinTakezou

+0

@Secure - да, find_string возвращает указатель на узел struct, который содержит указатель на строку. @ShinTakezou - я проверяю это, печатая строки node_p-> string и node_copy->. Второй печатает правильную строку. Первый печатает строку, не связанную с этой подпрограммой, но полностью используемую в другом модуле. – Rob

ответ

2

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

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

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

0

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

+0

Это делается с помощью процедуры need_this(). – Rob

Смежные вопросы