2010-09-27 47 views
3

我想用這樣的字符數組:的初始化已經宣佈C++

char theArray[]=new char[8]; 
theArray= { 1,2,3,4,5,6,7,8}; 

代替

char theArray[] = { 1,2,3,4,5,6,7,8}; 

是類似的事情可能嗎?

+1

使用'std :: vector',不要手動管理資源。 – GManNickG 2010-09-27 17:55:20

+1

你想達到什麼目的?靜態初始化動態分配的數組? – 2010-09-27 18:18:13

回答

6

的C++ 0x

char* ch; 
ch = new char[8]{1, 2, 3, 4, 5, 6, 7, 8}; 

@大衛索恩利:然後切換這些行並沒有問題。認真你談論在相同的存儲池作爲前值重新分配char[8],那麼你需要用自己的分配器,像玩:

char* ch1 = new char[8]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'i'}; 
char* ch2 = new(ch1) char[8]{1, 2, 3, 4, 5, 6, 7, 8}; 

AFAIK OP不太可能需要這一點。

+0

爲什麼不在一條線上? – 2010-09-27 15:55:03

+1

@Nemanja Trifunovic:不知道,問OP,因爲這是他要聲明和初始化分開:) – erjot 2010-09-27 16:03:13

+0

這並沒有解決確切的問題,因爲'新'是在OP的例子中的第一行,第二個在你的。 – 2010-09-27 17:44:22

2

這是可怕的,我知道,但也將在這種情況下工作:

memcpy(theArray, "\x01\x02\x03\x04\x05\x06\x07\x08", sizeof(theArray)); 
4
char theArrayCopy[] = { 1,2,3,4,5,6,7,8}; 
// 
// 
char* theArray=new char[sizeof(theArrayCopy)]; 
// or 
char theArray[sizeof(theArrayCopy)]; 

memcpy(theArray, theArrayCopy, sizeof(theArrayCopy)); 
+2

我推薦'std :: copy'(並且基本上從不使用低級別)操作符,但是否則我會這樣做。 – 2010-09-27 16:25:18

1

注:我知道這是不是答案原來的問題,但我認爲這是正確的要做的事情,所以我把它在這裏作爲CW後...

你可以概括它有點太多,如果你想...

class IntegerSequenceGenerator 
{ 
    int step_; 
    int value_; 
public: 
    IntegerSequenceGenerator(int start = 0, int step = 1) 
     : step_(step), value_(start) {} 
    int operator()() { 
     int result = value_ + step_; 
     std::swap(result, value_); 
     return result; 
    } 
}; 

用途:

int main() { 
    std::vector<int> myArray; 
    std::generate_n(std::back_inserter(myArray), 8, IntegerSequenceGenerator()); 
} 

或者:

int main() { 
    std::vector<int> myArray(8); 
    std::generate(myArray.begin(), myArray.end(), IntegerSequenceGenerator()); 
} 

或:

int main() { 
    int myArray[8]; 
    std::generate(myArray, myArray + (sizeof(myArray)/sizeof(int)), IntegerSequenceGenerator()); 
} 
3

一種可能性,你可能需要使用升壓分配,在那裏你可以使用這樣的考慮:

std::vector<int> v; 

v += 1, 2, 3, 4, 5, 6, 7, 8; 

這不起作用雖然它不一定是矢量,但它確實需要某種集合類,而不是內置類型。 OTOH,如果沒有一些極其的具體原因,否則,你可能想要使用一個集合。

+0

對於實際的數組,程序將生成1到8的值,然後將8添加到數組的起始地址,並且什麼也不做。但是,如果你打開了優化,它可能會完全跳過它,因爲它什麼都不做。這可以用於矢量的唯一可能的方式是運算符重載,它需要實際的類,而不是基本的類型或數組。 – 2010-09-27 17:46:33

+0

@大衛:是的 - 我其實並沒有真正想過,但現在你提到它了,我應該知道得更清楚,只是說它不起作用。我應該記住一個重載操作符需要一個UDT作爲至少一個操作數。 – 2010-09-27 18:03:51

1

有一個問題,其他答案沒有解決。 (雖然有幾個解決它。)

這地方char[8]類型的數組在棧上:

char theArray[] = { 1,2,3,4,5,6,7,8}; 

這地方就在堆(實際上它是非法的,但我會假設你的編譯器接受它):

char theArray[]=new char[8]; 

假如你真的不希望它在堆上,而只是希望對其進行初始化,這將工作:

char theArray[max_array_size]; // need to specify size to place on stack 

/* code */ 

static const char theInitializer[] = { 1,2,3,4,5,6,7,8}; 
std::copy(theInitializer, theInitializer + sizeof theInitializer, theArray);