Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zeigerproblem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.06.2005, 10:31 Uhr
~Marco_more
Gast


hallo zusammen,

bin noch recht neu in der c-programmierung und hab auch gleich ein problem. folgender code lässt sich kompillieren, läuft aber leider nicht...


C++:
int parsePermissions(char* string, unsigned int* permission)
{
  char* temp;
  char* tok;

  *permission = 0;
  if (!string) return 0;

  temp = strtok_r(string, PERMISSION_SEPERATOR, &tok);
  while(temp)
  {
    if(strcmp(temp, PERMISSION_READ_STRING)==0)
      { *permission |= PERMISSION_READ; }
    else if(strcmp(temp, PERMISSION_ADD_STRING)==0)
      { *permission |= PERMISSION_ADD; }
    else if(strcmp(temp, PERMISSION_CONTROL_STRING)==0)
      { *permission |= PERMISSION_CONTROL; }
    else if(strcmp(temp, PERMISSION_ADMIN_STRING)==0)
      { *permission |= PERMISSION_ADMIN; }
    else { return -1; }
    temp = strtok_r(NULL, PERMISSION_SEPERATOR, &tok);
  }
  return 0;
}


PERMISSION_SEPERATOR usw. sind als normale strings definiert!

hab ich nun folgende drei zeilen code:

C++:
int unsigned test;
char* pm = "read,add";
parsePermissions(pm, &test);


sagt mir das programm bei der programmausführung, speicherzugriffsfehler. allerdings finde ich keinen fehler in der logik! was mache ich falsch?

vielen dank!!!

gruß, marco.

(gcc 3.4.3)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.06.2005, 11:35 Uhr
ao

(Operator)


Ich glaube, strtok verändert den übergebenen String, indem an Stelle jedes gefundenen Separators ein '\0'-Zeichen eingesetzt wird. Deine Quelle ist ein String-Literal, und das darf im Read-Only-Speicher abgelegt werden, wo keine Schreibzugriffe erlaubt sind. Versuch mal so:

C++:
char pm [] = "read, add";


damit ist pm kein Zeiger auf Read-Only-Speicher, sondern eine schreibbare Kopie.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.06.2005, 11:37 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


strtok verändert den string nicht, es hat nen internen statischen speicher (bei strtok_r eben der 3te parameter)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.06.2005, 11:51 Uhr
virtual
Sexiest Bit alive
(Operator)


Klar verändern strtok und strtok_r *beide* den String, das ist doch Sinn und zweck der beiden.
strtok_r ist eben nur die Multithread Sichere variante, die es ermöglicht, daß der dritte Parameter, also der interne Status nicht static gehalten muß. Nichtsdestotrotz (== geilestes Deutsches Wort! ) wird eben der Inhalt des ersten parameters verändert (0 Byte schreiben).
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.06.2005, 19:57 Uhr
~marco_more
Gast


hi,

danke soweit! ja, mit


C++:
char pm[] = "read,add";



gehts tatsächlich. allerdings, wie gehe ich vor, wenn der string von einer usereingabe nur als zeiger auf einen nullterminierten string vorliegt?
und wie/warum entscheidet der compiler zwischen "read-only" und "write-"speicher?

gruß, marco.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.06.2005, 20:07 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


weil du es selber const gemacht hast

Zitat:

char const *p" (oder eben auch "const char *p") deklariert einen Zeiger auf einen read-only Character, "char * const p" dagegen deklariert einen konstanten Zeiger auf einen (variablen) Character (d.h. der Zeiger kann nicht verändert werden, wohl aber das, worauf er zeigt).




C++:
char* pm = "read,add";


definiert dir einen zeiger auf ein konstantes stringliteral...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
28.06.2005, 22:13 Uhr
ao

(Operator)



Zitat von ~marco_more:
wenn der string von einer usereingabe nur als zeiger auf einen nullterminierten string vorliegt ...

... dann ist er kein Literal und nicht "const", denn er ist ja vorher vom Benutzer eingegeben worden. Es liegt nicht am Pointer, sondern an dem, worauf der Pointer zeigt.

Zitat:
und wie/warum entscheidet der compiler zwischen "read-only" und "write-"speicher?

Erklärungen von const findest du zuhauf im Netz. Ein Stringliteral wie "read,add" ist implizit const. Das const-Attribut fällt weg, wenn der Inhalt des Literals in einen Speicherbereich kopiert wird, der mit char text [128]; angelegt wurde.

Wozu braucht man sowas? Nicht alle C-Programme werden von einem Betriebssystem in den Arbeitsspeicher geladen und dort ausgeführt. Manche laufen auch auf kleinen Embedded-Systemen. Das Programm liegt im EPROM und wird ausgeführt, sobald man einschaltet. Auf solchen Geräten ist RAM meist knapp, also werden die Konstanten direkt aus dem ROM geholt. Dort sind sie aber read-only (ROM halt), und diese Kenntnis wurde in die Sprache C eingebaut.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: