0

ここにコードがあります。私はg ++を使用しています

void initialize(int p, char a[], char b[])
{
    for(int i=0;i<6*p;i++)
    {
        a[i]='-';
        b[i]='-';
    }
}

int main()
{
    int p=9;
    char a[2*p],b[4*p];
    initialize(p,a,b);
    cout<<a<<endl<<b<<endl;
}

ここで、a と b が宣言される方法は、それぞれ 18 と 36 のサイズである必要があります。しかし、それらは出力に見られるほどではありません。何が起こっている?

Output:
------------------------------------------------------
------------------------------------------------------------------------------------------------------
4

4 に答える 4

2

割り当てたメモリの範囲外で初期化していてab

あなたがする必要があります

for(int i = 0; i < 2*p; ++i) {
    a[i]='-';
}

for(int i = 0; i < 4*p; ++i) {
    b[i]='-';
}

所有するメモリの外部にあるメモリに割り当てると、文字通り何でもできます。あなたの犬にファックスを送るようなものです。

于 2013-05-21T09:57:00.250 に答える
0
char a[2*p] will have 2*9=18 characters max.
char b[4*p] will have 4*9=36 characters max.

initialize は 6*9 = 54 文字を作成しますが、各オブジェクトは独自の制限内で受け入れます。ここで何をしようとしていますか?

于 2013-05-21T09:56:45.860 に答える
0

あなたのforループ:

for(int i=0;i<6*p;i++)

配列サイズを6*p例の whereとして扱いp==9ます。したがって、ループは配列サイズを 54 として扱います。

ただし、配列aには 18 要素しかないため、初期化によってこの配列がオーバーフローします。

配列bには 36 要素しかないため、初期化によってこの配列もオーバーフローします。

配列をオーバーフローさせると、おそらく書き込むつもりのないメモリに書き込まれ、あらゆる種類のバグが発生する可能性があります...

のような関数を使用する方がよいでしょう。また、文字列をNULL で終了する必要がありますか?

void initialize(char a[], size_t aSize, char b[], size_t bSize)
{
    int i = 0;
    for(; i < aSize-1; i++)
        a[i]='-';
    for(i = 0; i < bSize-1; i++)
        b[i]='-';

    // I think you need to NULL terminate....
    a[aSize-1] = '\0';
    b[bSize-1] = '\0';
}

int main()
{
    int p=9;
    char a[2*p],b[4*p];
    initialize(a, sizeof(a), b, sizeof(b));

    std::cout << a << std::endl << b << std::endl;
    return 0;
}

または、タイプではないmain()配列を使用したことがある場合は、関数内でさらに一般的に...char

initialize(a, sizeof(a)/sizeof(a[0]), b, sizeof(b)/sizeof(b[0]));

または、配列を初期化するにはmemset()を使用するだけで、関数は必要ありません:) initialize()

例えば

#include <string.h>

int main()
{
    int p=9;
    char a[2*p],b[4*p];

    memset(a, '-', sizeof(a)-1);
    a[sizeof(a)-1] == '\0';
    memset(b, '-', sizeof(b)-1);
    b[sizeof(b)-1] == '\0';

    std::cout << a << std::endl << b << std::endl;
    return 0;
}

私が考えたもう1つのことは、「文字列をNULLで終了していますか?上記の例を変更して、文字列を印刷するときに停止する場所がわかりません!

さらに別のオプションとして、std::fill()または*std::fill_n()*を指定することもできます。

#include <iostream> 
#include <algorithm>    // std::fill

int main(int argc, char* argv[])
{
    int p=9;
    char a[2*p],b[4*p];

    std::fill_n(a, sizeof(a)-1, '-');
    a[sizeof(a)-1] = '\0';

    std::fill_n(b, sizeof(b)-1, '-');
    b[sizeof(b)-1] = '\0';

    std::cout << a << std::endl << b << std::endl;
    return 0;
}
于 2013-05-21T09:58:20.517 に答える