Vad jag inte förstår är när det är en fördel att använda malloc? Jag har aldrig någonsin använt det.
I funktionen ser det ut ungefär så här (förenklat):
Kod: Markera allt
// Function which allocates memory using malloc()
#define BYTES 8 // Size of message
uint8_t func(uint8_t n, uint8_t input_data[][BYTES])
{
uint8_t *rx_data;
rx_data = (uint8_t *) malloc(BYTES*n);
for (int i = 0; i<n; i++)
{
SPI_read(device[i], rx_data, 8); // read 8 bytes into array rx_data
for (j = 0; j < BYTES; j++)
{
input_data[i][j] = rx_data[current_byte + (current_ic*BYTES_IN_REG)];
}
// ... do some other stuff
}
free(rx_data);
}
Men frågan är - hur skiljer sig ovanstående kod mot att man istället deklarerade en lokal array i funktionen. Det borde ju skapa ett tillfälligt utrymme precis som malloc. Enda skillnaden är väl att malloc skapar utrymme i "slutet" av de globala och statiska variablerna i RAM, medans den lokala arrayen hamnar i stacken. Då slipper man även användafree(), eftersom den lokala variabeln förstörs automatiskt när den inte längre behövs.
Finns det någon fördel eller nackdel med någon av metoderna?
Kod: Markera allt
// Function which allocates memory by declaring a local variable (array)
#define BYTES 8 // Size of message
uint8_t func(uint8_t n, uint8_t input_data[][BYTES])
{
uint8_t rx_data[BYTES]; // alloc. temporary data in memory
for (int i = 0; i<n; i++)
{
SPI_read(device[i], rx_data, 8); // read 8 bytes into array rx_data
for (j = 0; j < BYTES; j++)
{
input_data[i][j] = rx_data[current_byte + (current_ic*BYTES_IN_REG)];
}
// ... do some other stuff
}
}