0

ここで一体何が起こっているのか理解できません。私が期待しているのは、出力にはキーに1つの要素しかないということです。つまり、120バイトで0の位置だけを割り当てた場合、7つの要素があるということです。

void add2(char **b, char *i) {
    if (!i) {
        b[0] = (char*) malloc(120);
        sprintf(b[0], "%s", "hithere");
    } else {
        strcat(b[0], "\\\\");
        strcat(b[0], i);
    }
}

void add1(char **b) {
    add2(b, NULL);
    add2(b, "one");
    add2(b, "two");
    add2(b, "three");
}

void add() {
    char *keys[2];
    int i;
    add1(keys);
    fprintf(stderr, "%s\n", keys[0]);
    for (i = 0; keys[i]; i++)
        fprintf(stderr, "%d\n", i);
    free(keys[0]);
}

int main (int argc, char** argv)
{   
     add();
     add();
     return 255;
}

出力:hithere \ one \ two \ three 0 1 2 3 4 5 6 7 hithere \ one \ two \ three 0 1 2 3 4 5 6 7

文字列は私が期待するとおりですが、追加した要素は0だけなので、後には0だけを出力する必要があると思いました。free [0]だけでなく、各スポットを解放できるようにする必要がありますが、free [i]を出力するforループに入れると、スタックダンプが発生します。

以下の応答からの初期化に関して、2ではなく1000のような配列が必要な場合、1,000個の0を入力せずにすべてを0に初期化するにはどうすればよいですか。

4

4 に答える 4

4
/* ... */
void add() {
    char *keys[2];
/* ... */

keysはcharへの2つのポインターの配列ですが、初期化されていません
これを試して

/* ... */
void add() {
    char *keys[2] = {0, 0}; /* explicit initialization of the two elements */
/* ... */

すべてのメンバーに明示的な初期化子がない場合、初期化されていない初期化子はゼロ(タイプの右のゼロ)に初期化されます。

/* ... */
void add() {
    char *keys[1000] = {42}; /* explicit initialize the first element to 42 */
                             /* and implicitly initialize all other elements to 0 */
                             /* **ATTENTION** */
                             /* initializing a pointer to 42 is wrong */
                             /* I only wrote that as an example */
/* ... */

編集、標準からの引用

6.7.8初期化
構文
1

初期化子:

代入式
{初期化子リスト}
{初期化子リスト、}

初期化子リスト:

指定opt初期
化子-リスト、指定opt初期化子

空の初期化子リストの構文はありません。

于 2009-10-06T14:57:44.367 に答える
3

キー配列を初期化していないため、メモリ内にあるものはすべて含まれています。その場合、keys[1]および7まではゼロではありませんでした。

于 2009-10-06T14:56:25.413 に答える
1

質問の2番目の部分については、

2ではなく1000のような配列を初期化する必要がある場合は、次を使用します

char *keys[1000] = {0};

配列の1つの要素を値で初期化すると、配列の他のすべてのメンバーは自動的にゼロに初期化されます。

つまり、使用する場合

char *keys[1000] = {42};

次に、配列の最初のメンバーは42に初期化され、配列の他のすべてのメンバーは自動的にゼロに初期化されます。

于 2009-10-06T16:58:07.250 に答える
1

配列要素を暗黙的に0に初期化することと、memset()を使用して明示的に0に設定することの違いは何ですか?

char *data[1000] = {0};
memset(data, 0, sizeof data);

最初のオプション(暗黙的な初期化)は、配列のすべての要素を適切なタイプのゼロに設定します。2番目のオプションは、すべての要素(および任意のパディング)のすべてのビットを0に設定します。通常(現在のすべてのコンピューターの99.99% )、入力された0すべてのビット0の間に違いはありません。

セグメント化されたメモリを備えたコンピュータを想像してみてください...ポインタが2つの部分で構成されています。これを0(正しいタイプの0)に設定すると、コンパイラーはその0をすべてのビット0とは異なるものにすることができます。特にすべてのビットを0に設定すると、無効なポインターになる可能性があります。

void *test = 0; /* can make test something like "0xC0DE:0x0000" */
memset(test, 0, sizeof test); /* will make test as "0x0000:0x0000" */
于 2009-10-06T17:28:17.470 に答える