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

Can someone tell me how to fix this memory format for malloc?

提问人:LifeLong21 提问时间:8/8/2023 更新时间:8/8/2023 访问量:66

问:

我正在尝试为 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 指针 存储器 MALLOC CS50

评论

3赞 Some programmer dude 8/8/2023
下一行的初始化和赋值似乎都很奇怪。你想做什么?pBuffer
2赞 Some programmer dude 8/8/2023
请不要投射 malloc 的结果
1赞 Barmar 8/8/2023
int *pBuffer = buffer;这相当于@h0r53int *pBuffer = &buffer[0];
1赞 Barmar 8/8/2023
不要对变量使用名称。这通常用于宏。ALL_CAPS
1赞 ikegami 8/8/2023
你想做什么???

答:

1赞 ikegami 8/8/2023 #1

您所需要的只是

const int BLOCK_SIZE = 512;

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

嗯,不完全是。您可能需要检查结果以确保它不是 。mallocNULL

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

我仍然可以像往常一样使用阵列

好吧,你有一个指针,而不是一个数组。但实际上每次使用数组时,它都会降级为指向其第一个元素的指针。(例如,⇒ ⇒ )。所以是的,您可以将指针用作数组。(意思也同样有效。 是一个值得注意的例外。a[4]*( a + 4 )*( &a[0] + 4 )p[4]sizeof

2赞 Eric Postpischil 8/8/2023 #2
const int BLOCK_SIZE = 512;
int *BLOCK_MEM = (int *)malloc(sizeof(int) * 512);

在这里,您定义了一个值为 512 的命名常量,但随后使用文本 .如果它们应该是同一回事,请使用命名常量。如果它们应该不同,请定义第二个命名常量,并添加注释,解释为什么需要两个不同的值。512

在 C 中,与 C++ 不同,不建议强制调用 ,因为它可以抑制某些错误消息。此外,建议使用 ,其中 是被分配或初始化的指针,而不是 ,因为如果以后更改了类型,前者会自动适应,而后者要求在两个位置更改类型。(因此,改变前者的工作量较小,人类也不太可能错误地错过他们需要在多个地方进行更改的事实。mallocsizeof *ppsizeof (type)p

所以那条线会变成 .int *BLOCK_MEM = malloc(sizeof *BLOCK_MEM * BLOCK_SIZE);

int *pBuffer = &buffer[BLOCK_SIZE];

这初始化为 指向 的末尾,特别是指向 的最后一个元素之外的位置。那可能不是你想做的。要初始化为指向缓冲区的开头,可以使用 .但是,您也可以使用 ,因为以这种方式使用时,数组将自动转换为指向其第一个元素的指针。pBufferbufferpBufferpBufferint *pBuffer = &buffer[0];int *pBuffer = buffer;buffer

pBuffer = &BLOCK_MEM;

这在上一行中没有意义。 初始化,然后立即更改它,因此初始化不起作用。您应该简单地初始化为您希望它具有的值。而且,如果要指向分配的内存,则根本不需要定义,除非出于其他目的需要它。int *pBuffer = &buffer[BLOCK_SIZE];pBufferpBuffer = &BLOCK_MEM;pBufferpBufferbuffer

此外,此分配中的类型是错误的。 是指向 的指针,因此是指向指向 (type) 的指针的指针。但是是指向 (类型) 的指针。因此,编译器会发出一条消息,指出此赋值有问题。BLOCK_MEMint&BLOCK_MEMintint **pBufferintint *

要设置为指向 where 点,请使用 。pBufferBLOCK_MEMpBuffer = BLOCK_MEM;

评论

1赞 0___________ 8/8/2023
我认为 OP 需要先阅读他书中的指针和数组章节。