array of char*
-
Hallo!
Gibt es die Möglichkeit so was wie eine Array von Zeichenkette unter ANSI C zu verwenden. z.B.: a = {'test','string','hallo'}? char** klappt leider nicht.
-
char *aa[]={"hi","ho"};
-
Danke! Wie kann ich die Länge von char* rausfinden? strlen scheinbt nur mit C++ zu funktionieren.
-
nö sollte auch in C funktionieren
int a; a=strlen(string);
Befindet sich übrigens in string.h
-
für größen und längen Angaben sollte man übrigens size_t benutzen und nicht int!
-
Ich benutze "long long". 63 Bit dürften eigendlich reichen.
-
das solltest du nicht machen, weil du so nicht nur Speicherverschwendestest und Performance Probleme erzeugen kannst. Es kann auch zu Sicherheitsproblemen führen.
Angenommen in deinem Code kommt es irgend wie vor, dass der User die Möglichkeit hat einfluss auf die Allokierung eines Buffers zu nehmen oder auf den Zugriff. Hier ist das mal übertrieben dargestellt.
#include <stdio.h> #include <stdlib.h> #include <string.h> char *copy(size_t n,const char *bf) { char *ptr=malloc(n); strcpy(ptr,bf); return ptr; } int main() { fputs("blublub: ",stdout); long long size; scanf("%Ld",&size); const char *foo="hiho"; if(size<strlen(foo)) { //natürlich trauen wir der Eingabe nicht und prüfen ob nicht jemand eine zu kleine Zahl eingibt puts("nice try"); return 1; } char *blub=copy(size,foo); free(blub); return 0; }
Siehst du das Problem, was passiert wenn sizeof(long long)!=sizeof(size_t) ist?
-
Ich sehe da eigendlich kein Problem. Ich hatte mich für long long entschlossen, da och über 4GB hinaus will. Wieviele Bit hat den size_t? Ich bin in C noch recht neu (seit Ende Sommerferien). Hab vorher Delphi gemacht.
-
size_t ist ein unsigned Typ, der je nach Platform so groß sein sollte, dass man damit Array-größen etc. speichern kann.
Das Problem bei dem Code ist, wenn du eine Zahl eingibst, die größer als der Maximal Wert von size_t ist, erzeugst du einen Integeroverflow und kannst du Speicher allokieren, der kleine ist als das zu kopierende Array. In dem Fall endet das einfach in einem Segfault, aber wenn dir so etwas in Server oder Suid-Root Anwendungen passiert, kannst du zB. so einen DOS Angriff durchführen oder wenn du den Buffer manipulieren kannst einen Shellcode in das System einbringen.