2012-04-07 6 views
0

ich will (oder müssen) etwas entlang der Linien vonC strcpy in ein Array von Strings im gemeinsam genutzten Speicher

char **my_array = malloc(1000*64); 
strcpy(arr[0], "test"); 

zu tun, während ich weiß, dass arr [0] verweist nicht auf einem separaten Blatt Speicher zugewiesen, ich dachte, man sollte in der Lage sein, eine Zeichenfolge in diese zu kopieren (aber es teilt). Das funktioniert

arr[0] = "test"; 

Allerdings wird das nicht funktionieren, denn mein eigentliches Ziel ist es, dies im Shared Memory zu tun.

shm_array = shmget(IPC_PRIVATE, 1000 * 64, IPC_CREAT | 0644); 
my_array = (char**) shmat(shm_array, (void**)0, 0); 

Eigentlich könnte meine Frage umformuliert werden: „Wie kann man ein Array von Strings im gemeinsam genutzten Speicher erstellen?“. Ich habe versucht, 1000 separate "String" Shared Memory-Segmente zu erstellen, aber abgesehen davon hat es nicht funktioniert, es scheint auch falsch. Außerdem dachte ich, man sollte einfach in der Lage sein, mit relativen Pointer-Offsets in ein großes gemeinsames Speichersegment zu schreiben.

Antwort

1

Sie könnten nur ein einziges Stück Speicher erstellen und auf bestimmte Offsets schreiben:

char * const buf = malloc(HUGE); 

strcpy(buf + offset1, "hello"); 
strcpy(buf + offset2, "world"); 

Es wäre wahrscheinlich besser, strncpy zu verwenden und eine Größe von HUGE - offset entlang passieren, dass Sie laufen nicht zu machen über das Ende. Das Verwalten der Offsets ist Ihre eigene Verantwortung. Oder Sie können strncat verwenden, wenn die Effizienz nicht so wichtig ist.

+0

Das war, was ich eigentlich versuchte zu erreichen. Funktioniert auch mit dem Shared Memory-Segment. – MarkM

1

Es ist wie Sie für eine 2D-Array 1000 von 64 suchen sieht Wenn dies tatsächlich der Fall ist, können Sie dies tun:

struct shared_1000_by_64 { 
    char strings[1000][64]; 
}; 

struct shared_1000_by_64 *shared = malloc(sizeof(struct shared_1000_by_64)); 
for (int i = 0 ; i != 1000 ; i++) { 
    strcpy(shared->strings[i], "test"); 
} 

Dieser nutzt den Standard-Trick des Arrays von decaying into a pointer verhindern.

0

Wenn Sie möchten, eine Reihe von 64-Zeichen-Arrays dynamisch zuzuweisen, und lieber einen Zeiger auf ein Array verwenden, als ein Zeiger auf einen Zeiger:

char (*my_array)[64] = malloc(1000 * sizeof my_array[0]); 
strcpy(my_array[0], "test"); 

oder für die Shared-Memory-Fall

shm_array = shmget(IPC_PRIVATE, 1000 * sizeof my_array[0], IPC_CREAT | 0644); 
my_array = shmat(shm_array, NULL, 0); 
Verwandte Themen