将值插入大型数组C时程序崩溃

时间:2013-09-23 20:45:36

标签: c

我正在尝试做家庭作业来衡量二级缓存的大小。我正在尝试使用随机整数创建并填充一个大型数组(对于缓存而言太大),然后我将以不同的步长调整并对性能进行基准测试。

我遇到的问题是当我为大数组分配内存然后开始用1到100之间的随机整数填充数组时,程序崩溃(堆栈溢出?)。

不幸的是,我对c编程很陌生。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{
    int buffSize = sizeof(int) * 2000000;

    int * buff = (int*) malloc(buffSize);


    srand(time(NULL));

    for (int i = 0; i < buffSize; i++)
    {
        int r = rand() % 100 + 1;

        buff[i] = r;
    }

    return 0;
}

2 个答案:

答案 0 :(得分:4)

for (int i = 0; i < buffSize; i++)

你走得太远了。 bufsize2000000 * sizeof(int)时,您只需要上升到2000000。

答案 1 :(得分:0)

您没有创建新阵列,而是根据当前体系结构的int大小分配内存块。然后,您继续将其视为一个数组,因为数组和指针的工作方式是有效的。

一旦你这样做,你开始走数组,但你已经用内存的 size 将数组的长度混为一谈。如果每个int占用4个字节,则大小为2000000 * 4,但长度仅为2000000。这是因为你输入的每个int占用4个字节,因此你只能将size/4个项目放入该空间。

对于你想要的,只需创建一个数组就可以避免malloc问题,而且更明显:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{
    int arr_length = 2000000;
    int arr[arr_length];

    srand(time(NULL));

    for (int i = 0; i < arr_length; i++)
    {
        int r = rand() % 100 + 1;

        arr[i] = r;
    }

    return 0;
}