你的for循环:
for(int i=0;i<6*p;i++)
将数组大小视为6*p示例中的位置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;
}
我刚刚想到的另一件事是“您是否以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;
}