C Zweifacher Pointer

Nambot

Mitglied
Hi!
Ich habe ein paar Probleme mit doppelten Pointern. Ich benutze sie das erste Mal und komme irgendwie auf keinen grünen Ast.
Ich habe folgende Strukturen definiert:
Code:
typedef struct {
	u_int8_t dummy;
} TransportPacket;

typedef struct {
	TransportPacket **tpps;
	u_int64_t allocated_length;
	u_int64_t used_length;
} TransportPacketArray;

typedef struct {
	TransportPacketArray **arr_tpp;
	u_int16_t allocated_length;
	u_int16_t used_length;
	int32_t map_pid_to_arrayidx[USHRT_MAX];
} LastPackagesByPid;
Im Prinzip möchte ich in den Strukturen einen Pointer auf ein "Array" von Pointern haben, damit ich zur Laufzeit beliebig viele Elemente speichern kann. "map_pid_to_arrayidx" dient dazu von einer ID auf den Array Index zu kommen. Dadurch muss ich "nur" für jede mögliche ID Speicher für einen Integer reservieren anstatt für die gesamte Struktur, die ich schlussendlich speichern will.
Jetzt möchte mit folgendem Code ein neues Element im "Pointer-Array" in "LastPackagesById" erstellen:
Code:
void add_pid_package(TransportPacket *tpp, LastPackagesByPid *lpidp) {

	// manage memory if TransportPacketArray for this pid does not already exists
	if(pid_array_exists(tpp->pid, lpidp) == -1) {

		// initialize with malloc
		if(lpidp->allocated_length == 0) {
			lpidp->arr_tpp = malloc(3 * sizeof(TransportPacketArray));
			lpidp->allocated_length = 3;

		// resize with realloc
		} else if(lpidp->allocated_length <= lpidp->used_length) {
			lpidp->arr_tpp = realloc(lpidp->arr_tpp, (lpidp->allocated_length + 3) * sizeof(TransportPacketArray));
			lpidp->allocated_length += 3;
		}

		if(lpidp->arr_tpp == NULL) {
			printf("error allocating memory.\r\n");
		}

		TransportPacketArray *curr_tpp_arr = lpidp->arr_tpp[lpidp->used_length];
                // init new TransportPacketArray with some default values
                // and here occurs the ERROR
		curr_tpp_arr->allocated_length = 0; // <- Error "EXC_BAD_ACCESS"
		curr_tpp_arr->used_length = 0;

                // update our mapping array
		lpidp->map_pid_to_arrayidx[tpp->pid] = lpidp->used_length;
		lpidp->used_length++;
	}
	
	// ....
}
In der markierten Zeile erhalte ich dann den angegeben Fehler. Nur leider sehe ich meinen Fehler nicht, der zu dem Speicherfehler führt. Ich hoffe ihr könnt mir helfen, ist wahrscheinlich ein Anfänger-Fehler .... Ich hoffe ich bin das nicht komplett falsch angegangen ... ^^
schonmal vielen Dank für eure Hilfe

nambot
 
Hi.

Grundsätzlich ist die Verwendung so:
C:
TransportPacketArray **arr_tpp;
const int m = 3;

// Speicher für das Array erzeugen:
arr_tpp = calloc(m, sizeof(*arr_tpp);

// Speicher für die Elemente des Arrays erzeugen:
for (int i = 0; i < m; ++i) {
  arr_tpp = malloc(sizeof(**arr_tpp));
}

arr_tpp[1]->allocated_length = ...;

Du müßtest also erstmal Speicher für das Element bereitstellen, bevor du darauf zugreifen kannst.

Gruß

PS: realloc sollte man vermeiden. Warum verwendest du nicht eine Liste?
 
Ah okay, da ist mein Fehler. Ist ja auch eigentlich logisch :) Gut, dann werde ich das mal einbauen und sehen ob es klappt.

PS: realloc sollte man vermeiden. Warum verwendest du nicht eine Liste?
Bei Listen denke ich jetzt an C++ STL, wollte aber eigentlich nur C verwenden. Gibt es Listen auch in C?
 
Zurück