我知道在嵌入式环境中使用malloc是不鼓励的,但我发现了与我需要使用它的相关的例子,它对我来说很好。
这是代码,我发现它的执行有点令人困惑:
uint8_t * buffer; // pointer to buffer
uint8_t * buffer1; // pointer to buffer1
uint8_t * buffer2; // pointer to buffer2
buffer = malloc(400 * sizeof(uint8_t)); // size of buffer
buffer1 = malloc(400 * sizeof(uint8_t)); // size of buffer1
buffer2 = malloc(400 * sizeof(uint8_t)); // size of buffer2
这些是在调试执行开始时指针值的监视窗口。
执行到上面代码片段结束后的断点后。
当逐步使用调试器时,在malloc
行之后,我可以看到第一行将为buffer
指针分配地址。它只会对buffer
这样做,而不是buffer1
或buffer2
。
在更改内存分配顺序时也是如此,如下面的代码所示:
uint8_t * buffer; // pointer to buffer
uint8_t * buffer1; // pointer to buffer1
uint8_t * buffer2; // pointer to buffer2
buffer1 = malloc(400 * sizeof(uint8_t)); // size of buffer
buffer = malloc(400 * sizeof(uint8_t)); // size of buffer1
buffer2 = malloc(400 * sizeof(uint8_t)); // size of buffer2
在这种情况下,指针buffer1
将具有非零值,而其他指针将为null,如下面的手表中所示。
测试代码如下所示,将导致它为指针buffer1
分配一个值,当再次为它分配内存时,它会再次将其设置为零。
uint8_t * buffer; // pointer to buffer
uint8_t * buffer1; // pointer to buffer1
uint8_t * buffer2; // pointer to buffer2
buffer1 = malloc(400 * sizeof(uint8_t)); // size of buffer1
buffer = malloc(400 * sizeof(uint8_t)); // size of buffer
buffer1 = malloc(400 * sizeof(uint8_t)); // size of buffer1
当初始化具有其中一个缓冲区的结构时,当对空指针值执行assert()时,代码将在线下崩溃。
我使用malloc开始只是因为我在网上发现的这个code for implementing circular buffer。
虽然我对指针/内存相关的东西并不陌生,但它确实让我感到惊讶。我猜测我基本上误解了内存是如何分配的,或者是调试器和监视窗口如何更新指针值。
谢谢您的帮助。