Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C (C89 und C99) ::  Länge eines Arrays  
Gehen Sie zu Seite Zurück  1, 2
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Wutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.04.2010
Beiträge: 1913
Beitrag Wutz Mitglied 08:41:25 01.09.2010   Titel:              Zitieren

whitespaces schrieb:
Hmm schade das sizeof nach der Übergabe an eine Funktion nicht mehr klappt. Ich hatte nämlich vor in meiner Funktion erstmal zu überprüfen ob die Parameter ausreichend dimensioniert sind damit meine Funktion kein undefiniertes Verhalten erzeugt.
Wie löse ich sowas dann? Ich möchte ein char* str prüfen ob darin z.B. 32 Zeichen Platz hätten. Muss ich dann die Länge vorher mit sizeof bestimmen und dann als zusätzlichen Parameter mit übergeben oder wie lösen die Profis sowas?

Die Profis nehmen oftmals Arrays eben wegen der vorgegebenen festen Größe nicht. (C89) Viele Programme sind parametrisierbar, da verbietet es sich dann.
Das gilt auch für lokale nichtstatische Arrays, die selbst bei geringer Dimensionierung gerne mal einen Stacküberlauf produzieren (natürlich immer erst unter Einsatzbedingungen und nicht etwa während der Entwicklung :) ).
Den Vorzug haben dynamische, d.h. bei Bedarf größenmäßig erweiterbare Datenstrukturen. Und hierfür hat man üblicherweise Eigenentwicklungen für die Kapselung von *alloc/free oder man verwendet, wenn man mit den Lizenzen klarkommt, praktisch erprobte Frameworks, z.B. glib.

Für deinen Fall, und wenn du auf Arrays verzichtest und dyn.Speicher übergibst und MSVC/MinGW verwendest, wäre z.B. möglich:

Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
#include <malloc.h>
#ifndef __int64
#error such dir was anderes
#endif

void f(char *s)
{ printf("%lu\n", _msize(s)); }

main() {
f(malloc(4711));
return 0;
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
#include <malloc.h>
#ifndef __int64
#error such dir was anderes
#endif

void f(char *s)
{ printf("%lu\n", _msize(s)); }

main() {
f(malloc(4711));
return 0;
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
#include <malloc.h>
#ifndef __int64
#error such dir was anderes
#endif

void f(char *s)
{ printf("%lu\n", _msize(s)); }

main() {
f(malloc(4711));
return 0;
}


oder Beispiel für Holzhammer aber strikt C89:

Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
char *strErweitern(char *s,const char *anhang)
{
  s=realloc(s,strlen(s)+1+strlen(anhang));
  if(!s) ...
  return strcat(s,anhang);
}

main() {
char *s;
puts(s=strErweitern(strcpy(malloc(5),"1234"),"567890")); free(s);
return 0;
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
char *strErweitern(char *s,const char *anhang)
{
s=realloc(s,strlen(s)+1+strlen(anhang));
if(!s) ...
return strcat(s,anhang);
}

main() {
char *s;
puts(s=strErweitern(strcpy(malloc(5),"1234"),"567890")); free(s);
return 0;
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
char *strErweitern(char *s,const char *anhang)
{
  s=realloc(s,strlen(s)+1+strlen(anhang));
  if(!s) ...
  return strcat(s,anhang);
}

main() {
char *s;
puts(s=strErweitern(strcpy(malloc(5),"1234"),"567890")); free(s);
return 0;
}

whitespaces schrieb:

Macht es einen Unterschied ob ich char* str übergebe oder char atr[] ?

Nein. Nur das es knallt, wenn du ein sich hinter einem Zeiger versteckendes Array übergibst und in der Funktion dann versuchst, den Speicherbereich zu vergrößern.

_________________
Java, the best argument for Smalltalk since C++. -- Frank Winkler


Zuletzt bearbeitet von Wutz am 11:45:30 01.09.2010, insgesamt 1-mal bearbeitet
whitespaces
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.08.2010
Beiträge: 39
Beitrag whitespaces Mitglied 11:56:01 01.09.2010   Titel:              Zitieren

Dankeschön für die sehr ausführliche Erklärung. Ich werde dann mal was eigenes schreiben für die dynamische Speicherverwaltung, hier gab es ja auch einen guten Artikel wie man das macht. http://www.c-plusplus.de/forum/viewtopic-var-p-is-1463522.html
C/C++ Forum :: C (C89 und C99) ::  Länge eines Arrays  
Gehen Sie zu Seite Zurück  1, 2
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.