C. ile bir zil belleği yazıyorum Sonunda belleği boşaltmaya takılıyorum. Kod, iyi derler, ancak sonuç, ayrılmış belleği boşaltmak için circBuf_free
işlevinin başarısız olduğunu gösterir. ilgili kodlar şunlardır:C: bir yapıya ayrılan boş bellek çalışmıyor
#include <stdint.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //memcpy
#define kNumPointsInMyBuffer 16
#define initialSize 10
typedef struct CircBuf_t //struct name CircBuf_t
{
uint32_t *buffer;
int head; // keep track the newest data
int tail; // keep track the oldest data
int maxLen; // maximum number of items in the buffer
}circBuf_t; //type name circBuf_t
// initialize the circular buffer
void circBuf_init(circBuf_t *c, const int maxLen, int sz)
{
c->buffer = malloc(maxLen * sz);
c->maxLen = maxLen;
if(c->buffer == NULL)
printf("Buffer initialization fails\n");
c->head = 0;
c->tail = 0;
}
/* free the memory, free c->buffer first, then c*/
void circBuf_free(circBuf_t *c){
free(c->buffer);
free(c);
}
int main(){
// initilize ring Buffer
const int maxLen = kNumPointsInMyBuffer;
// original src
int src[1024] = {};
int i =0;
for(i=0; i<1024; i++){
src[i] = i;
}
//data
uint32_t data[1024];
memcpy(data, src, 1024);
printf("\nThe size of the uint32_t data array is %lu\n", sizeof(data));
int sz = sizeof(*data);
circBuf_t *cb;
cb = malloc(sizeof(circBuf_t));
circBuf_init(cb, maxLen, sz);
assert(cb);
printf("cb's value is %p\n", cb);
circBuf_free(cb);
printf("cb's value is %p\n", cb);
assert(!cb);
return 0;
}
Sonuç: sample.c: 73: ana: Onaylama
CB'nin değeri 0x1266010
CB'nin değeri 0x1266010
a.out mesafesindedir `! cb 'başarısız oldu.
Kesildi (çekirdek döküldü)
yapıya ibrenin adresleri aynıdır.
Yardım gerekiyor! özgür çağırdığınızda
Aynı olması bekleniyor. Hafızayı serbest bırakmak sadece belleği boşaltır, değişkenlerinizden hiçbirini değiştirmez. – molbdnilo
@molbdnilo Teşekkürler. Ama eğer öyleyse, serbest fonksiyonun işe yaradığına dair bir kanıt bulabilir miyim? – ulyssis2