簡體   English   中英

用字符串或字符動態分配(數組)

[英]dynamic allocation (arrays) with string or char

這里沒有問題:

int *x;
x = (int *) malloc(0 * sizeof(int));
int value = 5;
x = (int *) realloc(x,(value)*sizeof(int));

但是我不能為字符串做:\\

我想對ay []數組執行此操作,如下所示:

y[0]="hello"
y[1]="how are you"

我怎樣才能做到這一點?

std::vector<std::string> y;
y.push_back("hello");
y.push_back("how are you");

不要在C ++中使用mallocreallocfree 請勿將char*用於互操作以外的目的。 遠離指針,直到真正需要它們為止(與數組相同)。

您不能在std::string對象數組上使用realloc ,因為realloc通過位復制來移動事物,而這在常規對象上是不允許的。

標准類std::vector是對象的通用容器,可以正確移動和復制對象(使用復制構造函數,賦值和類似方法),並且可以使用resize方法更改其大小。 所有需要的內存都會根據需要自動分配和釋放。

例如,使用std::vector可以編寫如下代碼:

std::vector<std::string> v;  // An empty vector
v.resize(10);                // Now size is 10 elements (all empty strings "")
v[0] = "Hello";              // First element is now the string "Hello"
v[1] = "world.";             // Second element is now the string "world."
v.resize(2);                 // Now v.size() is 2
v.push_back("How's going");  // Now the size is 3 and third element is filled.

幫自己一個忙,拿起一本不錯的C ++書 ,從頭到尾閱讀它。 C ++是一種功能強大但復雜的語言,如果您嘗試通過嘗試使用編譯器來學習它,則由於許多原因,您會犯下嚴重的錯誤。

您現在正在執行的操作不是C ++ ...您可以使用C樣式的字符串來完成所需的操作,但是您將需要一個指針數組來鍵入char類型,該數組允許您訪問數組中每個字符串的已分配內存。 可以這樣完成:

char* y[2];
y[0] = strdup("hello");
y[1] = strdup("how are you");

您還需要記住,您的y數組現在“擁有”了指針,因此,如果您決定更改每個指針所指向的字符串,則必須在數組中的每個指針上調用free()以避免內存泄漏。 。

如果您想使用慣用的C ++解決方案,而不是恢復為C樣式的字符串,那么您應該使用std::stringstd::vector ...這樣做可以避免內存泄漏以及分配問題並取消分配與動態分配的C字符串關聯的內存。

實際上,您可以完全按照整數執行所需的操作:

typedef const char *c_string;
c_string *y;
y = (c_string *) malloc(0 * sizeof(c_string));
int value = 5;
y = (c_string *) realloc(y,(value)*sizeof(c_string));
y[0]="hello";
y[1]="how are you";

但是,這不適用於非const char * ,因此此示例的可用性受到限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM