2010-11-20 41 views
1

我有這樣的代碼:在C++與字符處理(沒有的std :: string)

char* value = "abcdefg"; 

char* secondValue = value; 

第二個值將得到的值確定的ADDRES?如果我刪除「價值」secondValue將無法使用我是嗎?

所以我應該做的:

char* value = "abcdefg"; 
secondValue = new char[strlen(value)]; 
strcpy(secondValue, value); 

所以如果我刪除 「價值」 沒有問題。

終於到dealloc的的secondValue我應該做的:

delete[] secondValue; 

是嗎?

+1

您的問題被標記爲C,但'delete'是C++語法。你的問題有點混亂。 – 2010-11-20 19:25:47

+0

新建/刪除?這就是C++。也許你應該看看std :: string。 – 2010-11-20 19:26:20

+0

好的我會改變標題,我沒有訪問我正在使用的組件上的std內容。 – okami 2010-11-20 19:27:56

回答

6

有兩個問題跟你寫的:

  1. 您不能刪除char *value = "abcdefg";,因爲它不是在堆上分配。 要分配堆內存,請使用new(使用C++)或malloc(使用C語言)。

  2. 當你爲一個字符串分配內存時,你總是需要一個額外的字節用於空終止。

在你的情況,你應該做的:

secondValue = new char[strlen(value)+1]; 

除此之外,你是正確的

3

如果您正在使用C++,你是正確的,但你需要secondValue一個字符變大:

secondValue = new char[strlen(value) + 1]; 

C風格的字符串以'\0'字符,這也需要存儲空間。

如果你正在使用的不是C++的C,沒有newdelete[],你必須使用的功能malloc()free()代替:

secondValue = malloc(strlen(value) + 1); 
... 
free(secondValue); 

在任何情況下,請注意,在該示例value是一個字符串文字,不能被刪除/釋放。你應該只刪除/釋放你分配給new/malloc的東西。

1

的方式你寫代碼:

char* value = "abcdefg"; 

編譯器將生成一個靜態字符串"abcdefg",並value將是一個指針。您可以分配secondvalue = value,然後value go out of scope, and secondvalue`仍然有效。

在您的示例中,沒有其他方法可以取消分配value

+0

所以如果char *值=「abcdefg」;內部是一個struct struct {char * value; } MyStruct;即使我刪除MyStruct類型的對象,「值」數據將是一個靜態的數據? – okami 2010-11-20 19:32:23

+0

是的,**如果**你用靜態常量初始化了'value'。 – 2010-11-20 19:37:20

相關問題