"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

C int nach char* Konvertierung

M.I.P.S. 14.10.2010 - 16:53 1653 3
Posts

M.I.P.S.

Big d00d
Avatar
Registered: Mar 2002
Location: On the inside
Posts: 324
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");
}

Die Ausgabe dazu ist:
Code:
The char array is 8 elements long
The elements are: @

Das seltsame ist, wenn man die printf Funktion (Zeile 17) verwendet wird das Richtige ausgegeben:
Code:
Inhalt von scat.buf: 34567890
The char array is 8 elements long
The elements are: 34567890
Deto bei beliebigen Ausgaben mit Variable. Bei statischen Strings bleibt die falsche Ausgabe.

:confused:

Irgendwelche Ideen, worans liegt bzw. wie ichs besser machen könnte?
tia

ARRAY

Little Overclocker
Avatar
Registered: Feb 2008
Location: 0x80003
Posts: 78
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

M.I.P.S.

Big d00d
Avatar
Registered: Mar 2002
Location: On the inside
Posts: 324
Jup, des wars.

Hab jetzt die Struct an die Funktion mitübergeben und jetzt funktionierts.

thx

DirtyHarry

aka robobimbo
Avatar
Registered: Apr 2001
Location: outer space
Posts: 464
ich hoffe auch mit bereits initialisierten char array, sonst hast das gleiche in grün, nur dass es blau ist :)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz