我对'C'相对较新,并希望对此主题有所了解。
基本上,我正在尝试创建一个16 MB的数组,并检查内存内容是初始化为零还是'\ 0'或学校项目的一些垃圾值。
这样的事情:
char buffer[16*1024*1024];
我知道程序堆栈的大小有限,显然我遇到了分段错误。可以使用malloc()吗?
以某种方式完成答案 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])
数据是禁忌。