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

我有一個指向結構的指針,指向存儲char *變量的另一個結構。問題是發送到此方法的指針(char *元素)在其他地方被修改,並且我不希望這些修改在table-> head->元素中受到影響。簡單地說,我想讓他們的價值觀相等,而不是參考。指定相同的值到2個指針,不等於它們的引用(C中的指針)

我知道我們可以將相同的值賦給2個指針,如下所示:* p1 = * p2。但是,我不知道如何做結構,我試過:

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

但它沒有奏效。

我希望我能澄清我的問題。

+1

'* table-> head-> element = * element;'? – 2015-02-09 03:08:58

+0

由於沒有工作,我的意思是我得到EXC_BAD_ACCESS(代碼= 1; ...) – fiz 2015-02-09 03:10:43

+0

,看起來像你沒有分配空間至少有一個指針 – 2015-02-09 03:11:18

回答

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 2015-02-09 03:17:34

+0

@Fiz做到這一點,你不能同時使用 - 保持指針,並期望值保持獨立。 – 2015-02-09 03:25:59

+0

@rSahu請你詳細說明你的意思? – fiz 2015-02-09 03:32:58

0

回覆OP在@GrahamPerks的回答中的評論。

,將工作,但我不希望使用更多的應對,因爲我們可以用指針做

比方說,通過element使用的內存看起來像如下:

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

如果您使用:

table->head->element = element; 

的值是ptr1

如果一段時間後,你說幹就幹,通過element改變ptr1的內容,例如通過使用:

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的值發生變化,你必須使用

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

複製的element的內容,或者,如果你的編譯器支持strdup,通過使用

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

OMG,感謝strdup()提醒!已經離開C太久了。 malloc&strcpy,傻我! – 2015-02-09 15:13:57

+1

@GrahamPerks malloc和strcpy是標準C函數,而strdup不是,所以你的代碼非常好! – 2015-02-09 19:35:51