2017-02-14 4 views
0

Ich habe ein modulares C-Programm, wo jedes Modul statische globale Variablen für die gemeinsamen Zugriff von Variablen zwischen den Funktionen des Moduls verwendet, aber nicht an anderen Module. Jetzt brauchen Sie ein dynamisch zugewiesenes Array, das für alle Modulfunktionen gleichermaßen zugänglich ist, aber ich bin nicht vertraut mit malloc. Unten ist ein vereinfachtes Beispiel von dem, was ich versuche zu tun. Dies scheint der richtige Weg zu sein, aber ich bin schüchtern, da ich keine ähnlichen Beispiele finden kann (und da das echte Ding viel komplizierter ist). Kann ich einen statischen Zeiger wie diesen beibehalten und die malloc und free verwenden, um zu bestimmen, welche Speicherblöcke kommen und gehen, aber einen guten Zeiger auf den aktuellen Block behalten?C statische Zeiger für dynamisches Array

static int *dataBlock = NULL; 
static int dataSize = 0, dataCursor = 0; 

// Init - called externally 
int initData(size) { 
    if (dataBlock || dataSize > 0) { 
     return -1; 
    } 
    dataBlock = malloc(sizeof(*dataBlock) * size); 
    if (!dataBlock) { 
     return -1; 
    } 
    dataSize = size; 
    dataCursor = 0; 
    return 0; 
} 

// Push - called externally 
int pushData(value) { 
    if (dataCursor >= dataSize) { 
     return -1; 
    } 
    dataBlock[dataCursor] = value; 
    dataCursor++; 
    return dataCursor; 
} 

// Free - called externally 
void freeData() { 
    free(dataBlock); 
    dataSize = 0; 
    dataCursor = 0; 
    dataBlock = NULL; 
} 
+0

Sie können. Und wenn ich das sehe, sehe ich nicht, warum man sich auf eine bestimmte Datengröße beschränkt. Sie können den Block neu zuweisen, sobald das aktuelle Limit erschöpft ist. – StoryTeller

Antwort

0

Ja, das wird (fast) funktionieren. Wenn Sie mit mehreren Threads auf diese Struktur zugreifen, schlägt sie fehl.

Es ist ein Defekt in pushData. Es wird das erste Element auf dataBlock [1] platzieren. Es sei angenommen, eine Größe von 3:

Anruf 1 - Datenblock [1]

2 gesetzt - Datenblock [2] gesetzt

3 - Datenblock [3] set - außerhalb der Grenzen.

+0

haben den Fehler akzeptiert und es behoben (sollten Sie diesen Kommentar entfernen?). Bitte erläutern Sie Ihren ersten Punkt über mehrere Threads – robisrob