Cast-Problem
-
nix casten.
probiers mal mit doku lesen.lies mal die doku zu strncat und dann schau nach welche parameter du übergibst.
vergleiche und staune
-
Das ist ja ein einziger Bughaufen. Du schreibst kreuz und quer wild durcheinander in irgendwelchen Speicher, deine Pointer sind fast alle uninitialisiert.
int main ( int argc, char* argv[], char* envp[] ) { char* header = "Content-type: text/html\n\n"; char* qstr = "name=midnighter&alter=22"; char** arr_keys; char** arr_values; int count; count = clean_qstring ( qstr, arr_keys, arr_values ); fprintf ( stdout, header ); fprintf ( stdout, "Anzahl Wertepaare: %d", count ); return 0; } int clean_qstring ( char* str, char* keys[], char* values[] ) { char* tmp=""; int i_key=0, i_val=0; while ( *str ) { if ( *str=='=' ) { strcpy ( keys[i_key++], tmp ); // CRASH, keys ist uninitialisiert strcpy ( tmp, "" ); // CRASH, tmp zeigt auf readonly-Speicher } else if ( *str=='&' ) { strcpy ( values[i_val++], tmp ); // CRASH, values ist uninitialisiert strcpy ( tmp, "" ); // CRASH } else strncat ( tmp, *str, 1 ); // CRASH } return i_key;
Mach dir an jeder Stelle, die ich markiert habe, Gedanken, wo exakt dort irgendwas hinkopiert wird.
-
Hallo nochmal,
könnt Ihr mir eventuell sagen, was ich mit der Speicherallozierung falsch mache?
Ich bekomme jetzt zwar keine Warnung mehr, aber dafür nen Segmentation Fault.
Danke!#include <stdio.h> #include <string.h> #include <stdlib.h> int clean_qstring ( const char* str, char* keys[], char* values[] ); int main ( int argc, char* argv[], char* envp[] ) { char* header = "Content-type: text/html\n\n"; const char* qstr = "vname=name=midnighter&alter=22"; char** arr_keys = (char**) calloc ( 20, 5 ); char** arr_values = (char**) calloc ( 20, 5 ); int count; count = clean_qstring ( qstr, arr_keys, arr_values ); fprintf ( stdout, header ); fprintf ( stdout, "Wertepaare: %d", count ); free ( arr_keys ); free ( arr_values ); return 0; } int clean_qstring ( const char* str, char* keys[], char* values[] ) { char* tmp = (char*) calloc ( 20, 1 ); int i_key=0, i_val=0, i=0; while ( *str ) { if ( *str=='=' ) { strcpy ( keys[i_key++], tmp ); strcpy ( tmp, "" ); } else if ( *str=='&' ) { strcpy ( values[i_val++], tmp ); strcpy ( tmp, "" ); } else strncat ( tmp, str, i ); i++; } free ( tmp ); return i_key; }
[ Dieser Beitrag wurde am 26.03.2003 um 21:52 Uhr von Midnighter editiert. ]
-
strcpy ( tmp, "" );
den gleichen Effekt kannst du auch schneller durch tmp[0]=0; erreichen
char** arr_keys = (char**) calloc ( 20, 5 );
den Rückgabewert von calloc und malloc zu Casten ist Gefährlich! Außerdem solltest du an der Stelle keine Konstante für die Typgröße nehmen, da diese Implementation Defined ist. Benutze lieber sizeof(char**).
nun zum eigentlichen Problem, du hast für arr_keys zwar Speicher reserviert, aber die Stellen auf die arr_keys zeigt, sind immer noch uninitialisiert.
-
Wahrscheinlich ne blöde Frage, aber was bedeuten die zwei Sternchen hinter dem char ??? Hab mich noch nicht sehr intensiv mit Zeigern außeinander gesetzt, aber ich denke das nötigste hab ich drauf, aber mit zwei Sternchen, hab ich noch nie gesehen.
-
Das bedeutet einfach einen Zeiger auf einen Zeiger
-
char* = zeiger auf char
char** = zeiger auf zeiger auf char
char*** und jetzt bist du dran :p
-
Original erstellt von Bashar:
char = zeiger auf char
char* = zeiger auf zeiger auf char
char*** und jetzt bist du dran :p**<troll>
Zeiger auf (Zeiger auf Zeiger)???
und weiter gehts: char*************** :p
</troll>
-
Original erstellt von kingruedi:
**
nun zum eigentlichen Problem, du hast für arr_keys zwar Speicher reserviert, aber die Stellen auf die arr_keys zeigt, sind immer noch uninitialisiert.**Ist denn der Speicherplatz, den ich mit calloc() reserviere nicht automatisch mit 0 initialisiert?
MfGr,
mid
-
jo isser. Du hast also effektiv ein Array von Nullpointern geschaffen.
-
Also irgendwie funzt das immer noch nicht.
Ich hoffe ich habe jetzt nichts blödes übersehen.
Vielleicht könnte nochmal einer mit den Augen drüber gleiten und sagen, was falsch ist???Danke!!!
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXROWS 10 #define MAXCOLS 128 int clean_qstring ( const char* str, char* keys[], char* values[] ); int main ( int argc, char* argv[], char* envp[] ) { char key_buf[MAXROWS][MAXCOLS]; char val_buf[MAXROWS][MAXCOLS]; char* header = "Content-type: text/html\n\n"; const char* qstr = "key1=val1&key2=val2"; char** arr_keys = calloc ( sizeof(char**), MAXROWS ); char** arr_values = calloc ( sizeof(char**), MAXROWS ); int count; arr_keys = key_buf; arr_values = val_buf; count = clean_qstring ( qstr, arr_keys, arr_values ); fprintf ( stdout, header ); fprintf ( stdout, "Wertepaare: %d" count ); free ( arr_keys ); free ( arr_values ); return 0; } int clean_qstring ( const char* str, char* keys[], char* values[] ) { char* tmp = (char*) malloc ( MAXCOLS ); int i_key=0, i_val=0, i=0; tmp = ""; while ( *str ) { if ( *str=='=' ) { strcpy ( keys[i_key++], tmp ); *tmp = 0; } else if ( *str=='&' ) { strcpy ( values[i_val++], tmp ); strcpy ( tmp, "" ); } else strncat ( tmp, str, i ); i++; } free ( tmp ); return i_key; }
[ Dieser Beitrag wurde am 26.03.2003 um 22:04 Uhr von Midnighter editiert. ]
-
Bitte lies dir Tutorials über Zeiger durch!
du reservierst speicher für ein char* Array und nacher weist du dem array etwas zu - sprich du verbiegst das array auf einen ganz anderen speicher - der allokierte speicher geht verloren.
wenn du speicher für ein char* array allokierst. wieviel speicher hat dann array[0] ?
garkeinen!
du musst jedem element auch noch speicher zuweisen.