我正在尝试为 C 中的数组分配内存,但出现错误。不知道这里出了什么问题。该错误正在向我大喊有关 pBuffer 的问题。
//Allocate memory
const int BLOCK_SIZE = 512;
int *BLOCK_MEM = (int *)malloc(sizeof(int) * 512);
int buffer[BLOCK_SIZE];
int *pBuffer = &buffer[BLOCK_SIZE];
pBuffer = &BLOCK_MEM;
即使这是正确的,我仍然能够正常使用该阵列,还是会遇到很多问题?
您所需要的只是
const int BLOCK_SIZE = 512;
int *pBuffer = malloc( sizeof(int) * BLOCK_SIZE );
嗯,不完全是。您可能需要检查
malloc
的结果以确保它不是 NULL
。
if ( !pBuffer ) {
perrror( "malloc" );
exit( EXIT_FAILURE );
}
const int BLOCK_SIZE = 512;
int *BLOCK_MEM = (int *)malloc(sizeof(int) * 512);
在这里,您定义了一个值为 512 的命名常量,但随后使用了文字
512
。如果它们应该是相同的东西,请使用命名常量。如果它们应该不同,请定义第二个命名常量并添加注释解释为什么需要两个不同的值。
在 C 中,与 C++ 不同,不建议对
malloc
进行调用,因为它可以抑制某些错误消息。另外,建议使用 sizeof *p
,其中 p
是正在分配或初始化的指针,而不是 sizeof (type)
,因为如果稍后更改 p
的类型,前者会自动适应,而后者则需要类型在两个地方被改变。 (因此,改变前者的工作量较少,而且人们不太可能错误地错过他们需要在多个地方进行更改的事实。)
int *pBuffer = &buffer[BLOCK_SIZE];
这会将
pBuffer
初始化为指向 buffer
的末尾,特别是指向 pBuffer
最后一个元素之外的位置。这可能不是您想要做的。要初始化 pBuffer
以指向缓冲区的开头,您可以使用 int *pBuffer = &buffer[0];
。但是,您也可以使用 int *pBuffer = buffer;
,因为以这种方式使用时,数组 buffer
将自动转换为指向其第一个元素的指针。
pBuffer = &BLOCK_MEM;
这与上一行没有意义。
int *pBuffer = &buffer[BLOCK_SIZE];
初始化pBuffer
,然后pBuffer = &BLOCK_MEM;
立即更改它,因此初始化没有效果。您只需将 pBuffer
初始化为您想要的值即可。而且,如果 pBuffer
将指向分配的内存,则根本不需要定义 buffer
,除非您需要它用于其他目的。
此外,此作业中的类型是错误的。
BLOCK_MEM
是指向 int
的指针,因此 &BLOCK_MEM
是指向 int
(类型 int **
)的指针。但 pBuffer
是指向 int
的指针(类型 int *
)。因此编译器会发出一条消息,表明该赋值有问题。
要将
pBuffer
设置为指向 BLOCK_MEM
所指向的位置,请使用 pBuffer = BLOCK_MEM;
。