Rückgabe von char-Arrays
-
schreib doch mal string = 0 oder string = NULL
denn 0 != "" && NULL != ""
aber NULL == 0nicht wahr nicht
-
Das bewirkt leider nichts.
Das Problem liegt wohl eher daran, dass die Funktion einen Zeiger zurück gibt, den sie eigentlich nicht zurückgeben kann.Ich weiß zwar innerhalb der Funktion meine max. string-größe, aber außerhalb eben nicht und daher kann ich wenn ich das richtig verstehe dort nicht mit festen char-arrays hantieren.
Ich habe auch schon probiert, in der Funktion eine neues char array zu definieren, und dieses dann zurückzugeben, aber das hat irgendwie auch nicht geklappt.gruß
dose
-
die beschreibung sagt es doch schon. die funktion gibt einen zeiger auf einen string in value zurück. woher weißt du aber, dass nach der rückkehr aus deiner funktion value* überhaupt noch auf gültigen speicher verweist. wobei mir schleierhaft ist ob
slapi_attr_first_value(attribute, &value);
überhaupt speicher für 'value' reserviert. wenn nicht, dann ist die ganze funktion b0rken
sollte also
string = slapi_value_get_string(value);
überhaupt einen gültigen zeiger auf einen string zurückliefern, dann kopiere ihn in schon allozierten speicher. den zeiger für schon allozierten speicher übergibst du ganz normal als parameter. also ungefähr so:
int get_attrib_of_entry(char * string, char *attrib, Slapi_Entry *orig_entry) {}
wobei du den freigewordenen rückgabewert jetzt auch als fehlerindikator benutzten kannst.
-
Ich denke die Funktion "slapi_attr_first_value" sollte doch stimmen, es ist der Zeiger auf einen Zeiger:
Syntax
#include "slapi-plugin.h"
int slapi_attr_first_value( Slapi_Attr *a, Slapi_Value **v );Parameters
This function takes the following parameters:
Parameter - Description
a Attribute containing the desired value.
v Holds the first value of the attribute.Returns
This function returns one of the following values:
• 0, which is the index of the first value.
• -1 if NULL.Mein Problem ist, dass ich vorher gar nicht weiß wie die Lang das Array werden kann. Es stellt sich erst während der Funktion herraus.
Wenn ich nun 2 Funktionen schreiben würde, die eine gibt als Rückgabewert die Länge des Strings zurück, die andere bekommt wie vorgeschlagen den den Zeiger auf einnen allokierten Speicher übergeben, so hätte ich 2 Zugriffe auf die Middleware, was viel IO-Zeit benötigt.
Kann ich nicht in der Funktion speicher so belegen, dass ich als Rückgabewert den Zeiger auf den Speicher übergeben kann und dieser noch zur Verfügung steht?gruß
dose
-
dose schrieb:
Kann ich nicht in der Funktion speicher so belegen, dass ich als Rückgabewert den Zeiger auf den Speicher übergeben kann und dieser noch zur Verfügung steht?
gruß
doseselbstverständlich, ganz normal mit malloc() und konsorten. aber vergiss das free() in solchen fällen nicht. dies vergisst man schnell, wenn man speicher in einer funktion alloziert und ihn in einer anderen verwendet. speicherlecks sind hässlich
-
Der Code sieht nun so aus:
Laut Plugin-API sollen anderen speicherbelegungsfunktionen verwendet werden:
alloc() = slapi_ch_malloc()
free() = slapi_ch_free()// this function finds an attrib of an entry char * get_attrib_of_entry(char *attrib, Slapi_Entry *orig_entry) { int connId, opId, rc = 0, i = 0; const char * string; Slapi_Attr * attribute; /* Entry attributes */ Slapi_Value * value; /* Attribute values */ Slapi_PBlock * neupb; char * retstr; rc |= slapi_entry_attr_find(orig_entry, attrib, &attribute); if (rc == 0) { for ( i = slapi_attr_first_value(attribute, &value); i != -1; i = slapi_attr_next_value(attribute, i, &value) ) { string = slapi_value_get_string(value); retstr = slapi_ch_malloc(strlen(string)); strcpy(retstr, string); } } else { slapi_log_info_ex( SLAPI_LOG_INFO_AREA_PLUGIN, SLAPI_LOG_INFO_LEVEL_DEFAULT, 0, 0, 0, "get_attrib_of_entry", "Attribute is missing in the entry.\n" ); retstr = slapi_ch_malloc(2); strcpy(retstr, "\0"); } return (retstr); }
Der Aufruf erfolgt so:
workstring = get_attrib_of_entry("uid", orig_entry); ....strcpy .... slapi_ch_free(workingstring);
Jedoch erscheint wieder eine Fehlermeldung, die ein Problem mit der Freigabe des in der Funktion allokierten Speichers hat (letzte Zeile).
pre.c: In function
master': pre.c:621: warning: passing arg 1 of
slapi_ch_free' from incompatible pointer typeGruß
dose
-
nimm doch einfach das 'const' von dem string weg. vielleicht liegt's daran.
--> http://c2.com/cgi/wiki?ConstIsaVirus
-
yup. wie sieht der prototyp von slapi_ch_free() aus?
-
slapi_ch_malloc()
Allocates space in memory.
Syntax
#include "slapi-plugin.h"
char * slapi_ch_malloc( unsigned long size );Parameters
This function takes the following parameter:
Parameter - Description
size - Size in bytes of the space for which you wish to get the memory.Returns
This function returns a pointer to the newly allocated space of memory. If space cannot be allocated (for example, if no more virtual memory exists), the slapd program terminates.Memory Concerns
This function should be called instead of the standard malloc() C function, and terminates the slapd server with an “out of memory” error message if memory cannot be allocated. The returned pointer should be freed by calling slapi_ch_free().bzw slapi_ch_free()
Frees space allocated by the slapi_ch_malloc(), slapi_ch_realloc(), and slapi_ch_calloc() functions and sets the pointer to NULL. Call this function instead of the standard free() C function.
Syntax
#include "slapi-plugin.h"
void slapi_ch_free( void **ptr );Parameters
This function takes the following parameter:Parameter - Description
ptr -Address of the pointer to the block of memory that you wish to free. If NULL, no action occurs.Memory Concerns
The ptr passed to slapi_ch_free() should be the address of a pointer that was allocated using a slapi call such as slapi_ch_malloc(), slapi_ch_calloc(), slapi_ch_realloc(), or slapi_ch_strdup().
-
oh, sorry, den thread hab ich leider aus den augen verloren
versuchs mal mit
slapi_ch_free(&workingstring);
oder hat sich das inzwischen erledigt?