2010-09-27 61 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);