在C中初始化一个16mb的数组

时间:2015-06-09 23:20:20

标签: c arrays segmentation-fault malloc heap

我对'C'相对较新,并希望对此主题有所了解。

基本上,我正在尝试创建一个16 MB的数组,并检查内存内容是初始化为零还是'\ 0'或学校项目的一些垃圾值。

这样的事情:

char buffer[16*1024*1024];

我知道程序堆栈的大小有限,显然我遇到了分段错误。可以使用malloc()吗?

以某种方式完成

4 个答案:

答案 0 :(得分:3)

您可以使用malloc初始化内存,如下所示:

#define MEM_SIZE_16MB   ( 16 * 1024 * 1024 )

char *buffer = malloc(MEM_SIZE_16MB * sizeof(char) );
if (buffer == NULL ) {
    // unable to allocate memory. stop here or undefined behavior happens
}

然后你可以检查内存中的值(注意这将打印很长时间):

for (int i = 0; i < MEM_SIZE_16MB; i++) {
    if( i%16 == 0 ) {
        // print a newline and the memory address every 16 bytes so 
        // it's a little easier to read
        printf("\nAddr: %08p: ", &buffer[i]); 
    }
    printf("%02x ", buffer[i]);
}
printf("\n");  // one final newline

完成后不要忘记释放内存

free(buffer);

答案 1 :(得分:2)

不确定

int memSize = 16*1024*1024;
char* buffer = malloc( memSize );
if ( buffer != 0 )
{
    // check contents
    for ( i = 0; i < memSize; i++ )
    {
        if ( buffer[i] != 0 )
        {
            // holler
            break;
        }
    }


    free( buffer );
}

答案 2 :(得分:2)

是的,您可能需要使用malloc()执行此操作,原因如下:

当启动任何程序(进程...线程...)时,会给它一块内存,用于存储(除其他外...)< / em>“本地”变量。此区域称为“堆栈”。它肯定不会大到足以存储16兆字节。

但是内存的另一个区域是任何程序都可以使用的:“”。这个区域(名称,“堆”,意图暗示......)没有固有的结构:它只是一个存储池,它通常足以存储许多兆字节。您只需malloc()所需的字节数,并在完成时free()这些字节。

只需定义与您需要存储的结构相对应的type,然后malloc(sizeof(type))。存储将来自堆。 (基本上,这就是 的堆 ...)

顺便提一下,有一个名为calloc()的库函数,它将保留一个“已知为零”的区域。此外,它可能会使用巧妙的操作系统技巧来非常有效地完成这项工作。

答案 3 :(得分:2)

严格地说,代码无法检查buffer是否未归零,而不会冒未定义行为的风险。如果类型是unsigned char,那么没问题。但是可能签名的char可能有陷阱值。尝试使用该值会导致UB。

char buffer[16*1024*1024];
// Potential UB
if (buffer[0])  ...

最好使用不能有陷阱值的unsigned char

#define N (16LU*1204*1204)
unsigned char *buffer = malloc(N);
if (buffer) {
   for (size_t i = 0; i<N; i++) {
     if (buffer[i]) Note_NonZeroValue();
   }
}

// Clean-up when done.
free(buffer);
buffer = 0;

关于C的棘手问题是,即使char没有陷阱值,一些智能编译器也可以识别代码正在尝试按照规范的UB 然后优化{ {1}}进入 nothing 。读取未初始化的非if (buffer[0])数据是禁忌。