0

我正在尝试做一个家庭作业来测量 L2 缓存的大小。我正在尝试用随机整数创建和填充一个大数组(对于缓存来说太大了),然后我将以不同的步长遍历它并对性能进行基准测试。

我遇到的问题是,当我为大数组分配内存然后开始用 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;
}
4

2 回答 2

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

你走得太远了。你只需要上升到 2000000 而bufsizeis 2000000 * sizeof(int)

于 2013-09-23T20:47:47.907 回答
0

您不是在创建一个新数组,而是根据当前架构的 int 大小分配一块内存。然后,您继续将其视为一个数组,因为 c 数组和指针是如何工作的。

一旦你这样做了,你就开始遍历数组,但是你已经把数组的长度和内存的大小混为一谈了。如果每个 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;
}
于 2013-09-23T20:54:08.690 回答