Meximale Größe eines char * rausbekommen

sand13r

Erfahrenes Mitglied
Halli Hallo Lieber Freunde der Sonne,

ich hab gerade ein kleines Problem,
und zwar versuche ich eine Funktion zu benutzen (strcpy_s) und da braucht man als 2tes Argument
die Größe des Strings in Bytes.
Jetzt meine Frage was braucht der da bzw wie bekomme ich das raus.

kleines Beispiel zur Erklärung:

Code:
int main( void )
{
	int g;

	char test[50];

	char *ptest;

	ptest=test;

	g=sizeof(ptest);     //ergibt 4
	//g=_countof((char [])ptest);   //geht nicht würde bei test aber 0 ergeben das was ich brauche
	g=strlen(ptest);   //ergibt 61 0_o

	test[0]=0;	
	
	g=strlen(ptest);   //ergibt 0

	return 0;

  
}



wie schaff ich es das ich mit dem ptest 50 rausbekomme?


Danke schonmal hoffe das des ohne weiteres geht

greetz sand13r
 
Zuletzt bearbeitet:
Hi.
Jetzt meine Frage was braucht der da bzw wie bekomme ich das raus.
Das geht nicht. Den Zeiger mußt du schon selber verwalten. D.h. du mußt dir selber merken wie groß das Objekt ist, auf das der Zeiger zeigt.

Wenn du den Zeiger auf test zeigen läßt, dann sind es natürlich 50 Bytes. Ansonsten mußt du dir immer (in einer Variablen) merken wieviel Speicher du alloziert hast.

Gruß

PS: Du weißt allerdings, das du den Zeiger hier überhaupt nicht benötigst?!
 
Hallo Sand13r,

die Größe 50, die du bei der Variablen "test" angibst, ist nur zur Kompilierungszeit bekannt. Es wäre daher möglich, zumindest ohne den Pointer "ptest", die Funktion "strcpy_s" auch ohne explizite Angabe der Größe aufzurufen.

Der Grund, warum "strlen" dir eine ungewollte Größe zurückliefert, sollte eigentlich ohne Probleme im Internet zu finden sein. Es sei aber auch gesagt, dass "strlen" die Größe zur Laufzeit errechnet.

Anders ist da der Operator "sizeof", der seine Berechnungen zur Kompilierungszeit vollbringt. Aus diesem Grund liefert er auch bei "sizeof(test)" 50, aber nur, weil der Typ 1 Byte groß ist!

Als eine mögliche Lösung kannst du folgendes machen:
Setze das letzte Element vom Array auf '\0', damit die Funktion "strlen" richtig funktioniert.

Gruß Mickeyman
 
Oh Hallo,

ok danke das is natürlich bitter ^^ dann muss ich es mir wohl selber merken ^^

Ja die Funktion is irgendwie komisch ^^ bei manchen will er die Größe nicht (wahrscheinlich bei arrays) aber bei Zeiger eben schon^^ ok danke nochmals für deine Hilfe bzw. Antwort!

greetz sand13r
 
Warum std::strlen nicht klappt? Weil du keine Null-Terminierung hast und der dann einfach wild deinen Speicher durchgeht und du irgendwo im Speicher ne 0 stehen hast.

Solange es ein Array und kein Zeiger auf ein Array ist, bekommst du per sizeof(array) / sizeof(array[0]).

C++:
#include <iostream>
#include <cstring>

int main()
{
	char test[50] = {0};
	std::cout << "cpp: \"char test[50];\"\nSize: " << sizeof(test) << "\n\t-Element-Size: " << sizeof(test[0]) << "\n\t-Element-Count: " << sizeof(test) / sizeof(test[0]) << std::endl;
	std::cout << "cpp: char* pointer; " << sizeof(char*) << std::endl; 

	std::cout << "\"test\" = \"" << test << " (" << std::strlen(test) << ")" << std::endl;
}
so ... vllt. hilft dir die Ausgabe von dem Programm ;) Zeiger sind bei 32bit Plattformen meist 4 groß.
C++:
char* ptr_test = test;
Das ist ein impliziter cast eines Arrays in einen Zeiger!
 
Zurück