2013-03-05 2 views
2

Каков наилучший способ инициализации массива строк в c?Каков наилучший способ инициализации массива строк в c?

Я попытался следующие две вещи

char arr[10] = "\0"; 
char arr1[10] = {"\0"}; 

После инициализации эти строки, я попытался показать в БГД, оба дали один и тот же формат инициализации.

(gdb) p arr 
$1 = "\000\000\000\000\000\000\000\000\000" 
(gdb) p arr1 
$2 = "\000\000\000\000\000\000\000\000\000" 
(gdb) 

Мне нравится знать, что является лучшим и в чем преимущество и недостатки.

Код: -

int main(){ 
    char arr[10] = "\0"; 
    char arr1[10] = {"\0"}; 

return 0; 
} 

Монтаж: -

(gdb) disass main 
Dump of assembler code for function main: 

0x00000000004004ec <+0>: push %rbp 
0x00000000004004ed <+1>: mov %rsp,%rbp 
0x00000000004004f0 <+4>: movzwl 0xd5(%rip),%eax  # 0x4005cc 
0x00000000004004f7 <+11>: mov %ax,-0x10(%rbp) 
0x00000000004004fb <+15>: movq $0x0,-0xe(%rbp) 
0x0000000000400503 <+23>: movzwl 0xc2(%rip),%eax  # 0x4005cc 
0x000000000040050a <+30>: mov %ax,-0x20(%rbp) 
0x000000000040050e <+34>: movq $0x0,-0x1e(%rbp) 
0x0000000000400516 <+42>: mov $0x0,%eax 
0x000000000040051b <+47>: pop %rbp 
0x000000000040051c <+48>: retq 
+1

Поправьте меня, если я ошибаюсь, но AFAIK они эквивалентны. – 2013-03-05 10:50:50

+0

Вы сравнили разборку и видите разницу на этом уровне? –

+0

@BarathBushan Я плохо разбираюсь в сборке. Позвольте мне также опубликовать мой ассемблерный код. – Thangaraj

ответ

7

Оба инициализацию полностью эквивалентны. От стандарта:

Массив типа символов может быть инициализирован с помощью строки символов буквальной или UTF-8, строки буквальной, необязательно заключено в скобках.

+1

Можете ли вы также = = {0} '? – Bingo

+0

@ Бинго: да. Мне нравится называть '{0}' универсальный нулевой инициализатор '. Он работает на все. – pmg

1

char arr[10] = "\0"; и char arr1[10] = {"\0"}; равные.

1

Высказывания

char arr[10] = "\0"; 

и

char arr1[10] = {"\0"}; 

точно так же.

3

Ваши две инициализации эквивалентны.

Помимо того, что вы показали, существует несколько способов, которые строка (не только [] массив) может быть инициализированы:

// fixed size, depending on the lenght of the string, no memory "wasted" 
char arr1[] = "value"; 

// fixed array size, depends on a given number, some memory may be unused 
char arr2[10] = "value"; 

// C-array type initialiation 
char arr3[] = {'v','a','l','u','e','\0'}; 

// special string, should never be modified, need not be freed 
char* str1 = "value"; 

// a dynamic string based on a constant value; has to be freed, but can be reallocated at will 
char* str2 = strdup("value"); 
+0

Не должно const char * str1 = "value"; вернее? – 2013-03-05 10:58:37

+0

Конечно, было бы! никто, кажется, не делает этого, хотя и хотел подчеркнуть, что его нельзя изменять даже без const – Dariusz

+0

'strdup()' не описывается стандартом C (это POSIX). Может быть, лучше для 'malloc()' и 'strcpy()'. – pmg

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