あなたの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;
}