有人可以告诉我如何修复malloc的内存格式吗?

问题描述 投票:0回答:2

我正在尝试为 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;

即使这是正确的,我仍然能够正常使用该阵列,还是会遇到很多问题?

c pointers memory malloc cs50
2个回答
0
投票

您所需要的只是

const int BLOCK_SIZE = 512;

int *pBuffer = malloc( sizeof(int) * BLOCK_SIZE );

嗯,不完全是。您可能需要检查

malloc
的结果以确保它不是
NULL

if ( !pBuffer ) {
   perrror( "malloc" );
   exit( EXIT_FAILURE );
}

0
投票
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;

© www.soinside.com 2019 - 2024. All rights reserved.