URL: https://www.overclockers.at/coding-stuff/c_int_nach_char_konvertierung_219576/page_1 - zur Vollversion wechseln!
Hej
Ich muß in einem in C geschriebenen Programm (Spread Toolkit) einige Daten verschicken. Dummerweise unterstützt Spread nur char* in einem Struct als Inhalt, weswegen ich einige Datentypen konvertieren muß, z.B. int. Ich hab eine Funktion geschrieben, die aber ein nicht nachvollziehbares Verhalten zeigt:
Code:#include <stdio.h> #include <string.h> typedef struct dummy_scat_element{ char *buf; int len; } scat_element; scat_element make_scat_from_int(int i) { scat_element scat; char content[12]; //4 byte int: max 10 digits + signum + '\0' char *p_pos; sprintf(content, "%d", i); scat.buf = content; //printf("Inhalt von scat.buf: %s\n", scat.buf); p_pos = strchr(scat.buf, '\0'); scat.len = (int) (p_pos - scat.buf); return scat; } void main() { scat_element scat = make_scat_from_int(34567890); printf("The char array is %d elements long\nThe elements are: ", scat.len); printf("%s", scat.buf); printf("\n"); }
Code:The char array is 8 elements long The elements are: @
Deto bei beliebigen Ausgaben mit Variable. Bei statischen Strings bleibt die falsche Ausgabe.Code:Inhalt von scat.buf: 34567890 The char array is 8 elements long The elements are: 34567890
Ich denke nur mal laut
Meiner Meinung nach fällt dein Problem unter den Begriff: "Geltungsbereich von Variablen"
Du erstellst in der Funktion "make_scat_from_int" die Variable "content", einen Pointer auf 12 lokal(!!) allokierte Elemente (=Array), dann schreibst du in "scat.buf" die Adresse auf die "content" zeigt.
Wenn du nun aber "return scat" machst gibst du auch "scat.buf", also die Adresse auf die "content" zeigt zurück. Das Problem ist nur, dass "content" auf einen lokal allokierten Speicher verweist und daher von außen nicht erreichbar ist.
hth
Jup, des wars.
Hab jetzt die Struct an die Funktion mitübergeben und jetzt funktionierts.
thx
ich hoffe auch mit bereits initialisierten char array, sonst hast das gleiche in grün, nur dass es blau ist
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025