在Tiva C启动板(ARM Cortex M4)上分配内存时遇到问题,我要做的是动态分配指向另一个结构内部结构的指针,在某些时候calloc()
返回一个指针与存储指针的地址值相同。
我发现这有点难以解释,所以我制作了这段代码,说明我想要做什么,并且在here上完全正常,但它在我的应用程序中的工作方式不同。 / p>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
typedef struct
{
uint32_t Pin;
uint32_t Port;
} fGpio_Pin;
typedef struct
{
uint32_t Mode;
uint32_t nPins;
fGpio_Pin** Pins;
} fSpi_Mod;
fSpi_Mod* Spi;
void printSizes (void)
{
printf("Size of uint8_t: %i bytes.\n", sizeof(uint8_t));
printf("Size of uint16_t: %i bytes.\n", sizeof(uint16_t));
printf("Size of uint32_t: %i bytes.\n", sizeof(uint32_t));
printf("Size of uint64_t: %i bytes.\n", sizeof(uint64_t));
printf("Size of fSpi_Mod*: %i bytes.\n", sizeof(fSpi_Mod*));
printf("Size of fSpi_Mod: %i bytes.\n", sizeof(fSpi_Mod));
printf("Size of fGpio_Pin**: %i bytes.\n", sizeof(fGpio_Pin**));
printf("Size of fGpio_Pin*: %i bytes.\n", sizeof(fGpio_Pin*));
printf("Size of fGpio_Pin: %i bytes.\n", sizeof(fGpio_Pin));
printf("----\n");
}
void printStructure (fSpi_Mod* Spi_Mod)
{
uint8_t i;
printf("The address of the structure is 0x%X.\n", Spi_Mod);
printf("The value of mode is 0x%X and address 0x%X.\n", Spi_Mod->Mode, &(Spi_Mod->Mode));
printf("The value of nPins is 0x%X and address 0x%X.\n", Spi_Mod->nPins, &(Spi_Mod->nPins));
printf("The value of Pins is 0x%X and address 0x%X.\n", Spi_Mod->Pins, &(Spi_Mod->Pins));
for (i = 0; i < Spi_Mod->nPins; i++)
{
printf("#%i | The pointer that points to Gpio structure is 0x%X at address 0x%X.\n", i, *(Spi_Mod->Pins + i), &(*(Spi_Mod->Pins + i)));
printf("#%i | The value of Pin of Gpio structure is 0x%X and address 0x%X.\n", i, ((*(Spi_Mod->Pins + i)))->Pin, &(((*(Spi_Mod->Pins + i)))->Pin));
printf("#%i | The value of Port of Gpio structure is 0x%X and address 0x%X.\n", i, ((*(Spi_Mod->Pins + i)))->Port, &(((*(Spi_Mod->Pins + i)))->Port));
}
printf("----\n");
}
int main()
{
uint8_t i = 0;
printf(">>>> Begin program.\n");
printSizes();
Spi = (fSpi_Mod*) calloc(1, sizeof(fSpi_Mod));
if (Spi == NULL) {
printf("Insufficient memory.\n");
return 1;
}
//printStructure(Spi);
Spi->Mode = 0x05;
Spi->nPins = 0x04;
Spi->Pins = (fGpio_Pin**) calloc(Spi->nPins, sizeof(fGpio_Pin*));
if (Spi->Pins == NULL)
{
printf("Insufficient memory.\n");
return 1;
}
//printStructure(Spi);
for (i = 0; i < Spi->nPins; i++)
{
(*(Spi->Pins + i)) = (fGpio_Pin*) calloc(1, sizeof(fGpio_Pin));
if ((*(Spi->Pins + i)) == NULL)
{
printf("Insufficient memory.\n");
return 1;
}
}
printStructure(Spi);
printf(">>>> End program.\n");
}
在我的应用程序中,当我尝试分配四个类型为“(fGpio_Pin*)
指针”的指针并将其转换为(fGpio_Pin**)
时,calloc()
返回Spi->Pins
的地址,所以基本上Spi->Pins
的地址和它的值是相同的,它变成了一个指向自身的指针,那就是问题开始出现的时候。
堆中有足够的内存,而calloc()
没有返回NULL
指针,这可能是依赖于实现的吗?我使用的是TI ARM编译器和Code Composer Studio,而不是gcc。
也许我错过了一些东西所以我会继续寻找。谢谢你的时间。
EDIT1:
这是上面代码的输出,可以正常工作。
>>>> Begin program.
Size of uint8_t: 1 bytes.
Size of uint16_t: 2 bytes.
Size of uint32_t: 4 bytes.
Size of uint64_t: 8 bytes.
Size of fSpi_Mod*: 8 bytes.
Size of fSpi_Mod: 24 bytes.
Size of fGpio_Pin**: 8 bytes.
Size of fGpio_Pin*: 8 bytes.
Size of fGpio_Pin: 8 bytes.
----
The address of the structure is 0x1DF7010.
The value of mode is 0x5 and address 0x1DF7010.
The value of nPins is 0x4 and address 0x1DF7014.
The value of Pins is 0x1DF7030 and address 0x1DF7018.
#0 | The pointer that points to Gpio structure is 0x1DF7060 at address 0x1DF7030.
#0 | The value of Pin of Gpio structure is 0x0 and address 0x1DF7060.
#0 | The value of Port of Gpio structure is 0x0 and address 0x1DF7064.
#1 | The pointer that points to Gpio structure is 0x1DF7080 at address 0x1DF7038.
#1 | The value of Pin of Gpio structure is 0x0 and address 0x1DF7080.
#1 | The value of Port of Gpio structure is 0x0 and address 0x1DF7084.
#2 | The pointer that points to Gpio structure is 0x1DF70A0 at address 0x1DF7040.
#2 | The value of Pin of Gpio structure is 0x0 and address 0x1DF70A0.
#2 | The value of Port of Gpio structure is 0x0 and address 0x1DF70A4.
#3 | The pointer that points to Gpio structure is 0x1DF70C0 at address 0x1DF7048.
#3 | The value of Pin of Gpio structure is 0x0 and address 0x1DF70C0.
#3 | The value of Port of Gpio structure is 0x0 and address 0x1DF70C4.
----
>>>> End program.
在我的申请表中(我无法发布图片,但我没有足够的声誉):
calloc之后:
答案 0 :(得分:0)
我认为你的第一个calloc调用是分配不足的内存。从您发布的调试器的屏幕截图中:
SpiRfid = (fSpi_Mod*) calloc(1, sizeof(SpiRfid));
这将为指针分配足够的内存,而不是结构。你可能想要
SpiRfid = (fSpi_Mod*) calloc(1, sizeof(*SpiRfid));
答案 1 :(得分:0)
如图所示并由Matthew Wightman指出,第一个calloc是不正确的,特别是sizeof运算符。图像的sizeof运算符为指针指向fSpi_Mod结构的指针分配了空间(SpiRfid是这种变量)我想要的是为fSpi_Mod结构分配空间。这是我的错字。
因此,改变这个:
sizeof(SpiRfid)
对此:
sizeof(fSpi_Mod)
让它发挥作用。这只是一种可能的解决方案。