2009-06-25 5 views
-4

Почему я не могу инициализировать локальный массив со строкойC++ массив инициализации

+10

Дайте нам код, это может сделать вопрос немного яснее. – mikek

+0

Вы хотите спросить: «Почему я не могу инициализировать локальный массив ** из строки?» –

ответ

7

Почему я не могу инициализировать локальный массив со строкой

Правильный ответ в том, что вы можете - для заданного определения массива и строки. Чего именно вы хотите достичь?

char str[] = "Hello world"; 
+0

это лучше будет «const char str []». В противном случае вы можете записать в исполняемые байты. – xtofl

+3

@xtofl: Нет. В приведенном выше коде постоянный строковый литерал * скопирован * в место для записи в памяти. Код безопасен, и 'str' можно безопасно манипулировать. Вы были бы правы, если бы я использовал указатель вместо массива. –

4

Вопрос очень тощий на деталях, но:

char arr[] = {'a','b','c', 0}; 

или

char arr[] = "string"; 

EDIT:

В ответ на вопросы:

char s1[] = "hi"; 
char s2[] = {'h','i',0}; 
memcpy(s1, "by", sizeof(s1)); 
memcpy(s2, "by", sizeof(s2)); 
cout << ios::hex << &s1 << endl; 
cout << ios::hex << &s2 << endl; 
cout << s1 << endl; 
cout << s2 << endl; 

Печать:

80xbfffed72 
80xbfffed6f 
by 
by 

По крайней мере, на моей системе это выглядит как распределяются в том же пространстве памяти, я не вижу никаких проблем или разногласий. C, например, определяет string как массив с нулевым завершающим символом - я считаю, что это то же самое в C++, чтобы не путать с std::string.

+0

Это не эквивалент: последняя форма позволяет вам, например, memset (arr, 0, 7) и таким образом изменить сегмент данных вашего исполняемого файла. – xtofl

+1

@xtofl: Можете ли вы углубиться в это более подробно? Я почти уверен, что оба они эквивалентны. Было бы иначе, если бы второй был «const char * arr =», но это не так, и я уверен, что цитированная строка является просто специальным синтаксисом для агрегатного инициализатора, и поэтому поведение должно быть идентичным. –

1
std::vector<std::string> abc(5,"abc"); 

будет создавать вектор с 5 элементами, инициализированными «abc».

Смежные вопросы