2015-02-09 2 views
0
printf("%p\n\n", element);  //0x1000020c0 
    table->head->element = element; 
    printf("%p\n\n", table->head->element); //0x1000020c0 

У меня есть указатель на структуру, которая указывает на другую структуру, где хранится переменная char *. Проблема заключается в указателе (элементе char *), который отправляется этому методу, изменяется где-то в другом месте, и я не хочу, чтобы эти изменения влияли на элемент table-> head->. Просто сказал, что хочу сделать свои значения равными, а не ссылку.Назначение одинаковых значений двум указателям, не равным их ссылкам (указатели в C)

Я знал, что мы можем назначить одинаковые значения двум указателям следующим образом: * p1 = * p2. Тем не менее, я не знаю, как сделать это с помощью структур, я попробовал:

*(table->head->element) = *element; 

Но это не сработало.

Надеюсь, я смогу прояснить свой вопрос.

+1

'* таблица-> head-> element = * element;'? –

+0

Не работает Я имею в виду, что я получаю EXC_BAD_ ACCESS (code = 1; ...) – fiz

+0

, похоже, что вы не выделили место хотя бы для одного из указателей. –

ответ

2

Если вы хотите, чтобы строка с указанием на копию, а не просто ссылка, вам понадобится strcpy() в какую-то новую память. например

int len = strlen(element); 
table->head->element = malloc(len+1); // +1 for string-terminating null 
strcpy(table->head->element, element); 

(или использование strdup() для решения одной строки, как указано в ответе R Sahu в).

+0

Это будет работать, но я не хочу использовать дополнительное копирование, потому что мы можем сделать это с помощью указателей – fiz

+0

@Fiz, вы не можете иметь оба - сохранить указатель и ожидать, что значение останется независимым. –

+0

@rSahu, пожалуйста, уточните, что вы имеете в виду? – fiz

0

Отвечая на комментарии OP в ответ от @GrahamPerks.

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

Скажем, память, используемую element выглядит следующим образом:

element +---------+  +---+---+---+---+---+---+---+---+------+ 
     | ptr1 | -> | a | | s | t | r | i | n | g | '\0' | 
     +---------+  +---+---+---+---+---+---+---+---+------+ 

Если вы используете:

table->head->element = element; 

значение table->head->element - ptr1.

Если через некоторое время, вы пошли вперед и изменили содержание ptr1 через element, например, с помощью:

fscanf(file, "%s", element); 

Вы могли бы в конечном итоге с:

element +---------+  +---+---+---+---+---+---+---+---+---+---+------+ 
     | ptr1 | -> | n | e | w | | s | t | r | i | n | g | '\0' | 
     +---------+  +---+---+---+---+---+---+---+---+---+---+------+ 

В этот момент, строка, которую вы видите от table->head->element, составляет "new string", а не "a string".

Это то, что происходит, когда вы не копируете содержимое element, а просто копируете значение указателя element.

Если вы хотите, чтобы значение table->head->element оставаться "a string" в то время как значение element изменений, вы должны скопировать содержимое element с помощью

int len = strlen(element); 
table->head->element = malloc(len+1); 
strcpy(table->head->element, element); 

или, если ваш компилятор поддерживает strdup, используя

table->head->element = strdup(element); 
+0

OMG, спасибо за напоминание о strdup()! Вышел из С слишком долго. malloc & strcpy, глупый я! –

+1

@ GrahamPerks malloc и strcpy - это стандартные функции C, в то время как strdup - нет, поэтому ваш код в порядке! –