2

cの文字列配列を初期化する最良の方法は何ですか?

私は2つのことをフォローしてみました

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

これらの文字列を初期化した後、gdbで表示しようとしましたが、どちらも同じ初期化形式でした。

(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   
4

4 に答える 4

7

両方の初期化は完全に同等です。標準から:

文字タイプの配列は、文字列リテラルまたはUTF-8文字列リテラルで初期化できます。オプションで中括弧で囲みます。

于 2013-03-05T10:50:57.343 に答える
3

2つの初期化は同等です。

あなたが示したものとは別に、文字列([]配列だけでなく)を初期化することができるいくつかの方法があります:

// 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");
于 2013-03-05T10:55:07.923 に答える
1

char arr[10] = "\0";char arr1[10] = {"\0"};等しい。

于 2013-03-05T10:51:17.333 に答える
1

ステートメント

char arr[10] = "\0";

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

まったく同じです。

于 2013-03-05T10:52:23.133 に答える