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

您的初始化远远超出了您分配的内存范围,a并且b

你需要做

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

你的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;
}
于 2013-05-21T09:58:20.517 回答
0
char a[2*p] will have 2*9=18 characters max.
char b[4*p] will have 4*9=36 characters max.

初始化创建 6*9 = 54 个字符,但每个对象在其自己的限制内接受。你想在这里做什么?

于 2013-05-21T09:56:45.860 回答
0

您得到的输出只是因为您没有终止字符串。如果您以其他方式放置代码,您可能不会获得与现在相同的输出。只是你继续初始化数组越界并且不知何故两个数组彼此靠近并cout寻找下一个'\0'直到它打印的位置。

只需对数组进行空终止,然后一切都很好。

于 2013-05-21T10:40:58.057 回答