WinFuture-Forum.de: Noobie Frage In C ! - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

Noobie Frage In C !


#1 Mitglied ist offline   dcom 

  • Gruppe: aktive Mitglieder
  • Beiträge: 127
  • Beigetreten: 11. Juli 04
  • Reputation: 0

geschrieben 20. April 2005 - 18:10

bin noch anfänger in c und hab da eine frage was pointer betrifft !

hier erstmal der code :

char *ptr1 = "10 spaces";

ptr1[5]='a';



syntaktisch is es ja ok aber beim ausfüren gibt es einen runtime error !
wieso ?
0

Anzeige



#2 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 20. April 2005 - 18:17

Vielleicht weil ptr1 nur auf genau einen Char und eben kein 10er-Array von Chars zeigt? Du schreibst mit diesem Code blind in nichtinitialisierten Speicher.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#3 Mitglied ist offline   dcom 

  • Gruppe: aktive Mitglieder
  • Beiträge: 127
  • Beigetreten: 11. Juli 04
  • Reputation: 0

geschrieben 20. April 2005 - 18:23

dann stell dir anstelle der "10 spaces" halt 10 zahlen oder buchstaben vor !
aber es gibt dann immernoch einen fehler !

ich will doch nur einen pointer auf char mit einem string initialisieren und dann an einer bestimmten stelle einen anderen char einfügen !



hier ist die quelle aus meinem skript : da steht es ist ok !!!!!

#include <stdlib.h>
int main( void )
{
char array[10];
char *ptr1 = "10 spaces";
char *ptr2;
array = "not OK"; /* cannot assign to an address */
/* of an array */
array[5] = 'A'; /* OK */
ptr1[5] = 'B'; /* OK */
ptr1 = "OK"; /* original string ist lost in */
/* memory! */
ptr1[5] = 'C'; /* "legal" but runtime error due */
/* to prior assignment of */
/* of 2-character string */
*ptr2 = "not OK"; /* type mismatch */
ptr2 = "OK"; /* OK although ptr2 was not */
/* initialized */
exit( 0 );
}

Dieser Beitrag wurde von dcom bearbeitet: 20. April 2005 - 18:26

0

#4 Mitglied ist offline   guard 

  • Gruppe: Mitglieder
  • Beiträge: 6
  • Beigetreten: 22. April 05
  • Reputation: 0
  • Interessen:C/C++<br />SDL<br />GTK

geschrieben 22. April 2005 - 07:53

Hi dcom,

was mir sofort ins Auge sticht ist das, dass du ein sogenanntes "undefined behavior" erzeugst (quasi ein undefinertes Verhalten).

Denn mit "ptr2" schreibst du auf Speicher, der noch nicht mal angelegt wurde. Du solltest dir erst mal Speicher holen -> siehe malloc.

[edit]
Noch was: wenn du einen String in einen Speicherbereich schreiben möchtest, dann mach das doch bitte mit strncpy. Mit dem "="-Operator wirst du dich schwer tun. Konsultiere doch noch mal ein C-Buch dazu. Da sollte es drin stehen :P
[/edit]

Vielleicht das als kleine Hilfestellung :gähn:

So long ...

Dieser Beitrag wurde von guard bearbeitet: 22. April 2005 - 07:59

0

#5 Mitglied ist offline   dcom 

  • Gruppe: aktive Mitglieder
  • Beiträge: 127
  • Beigetreten: 11. Juli 04
  • Reputation: 0

geschrieben 22. April 2005 - 14:45

hm also malloc sollte ich für sowas eigentlich nicht brauchen da es sich hier ja nicht um dynamische daten handelt !
und meine frage bezog sich auch nicht auf den ptr2 sondern auf ptr1[5] !
so weit ich es verstanden habe ist das mit ptr1 zwar vom syntax ok aber es kommt zu einem laufzeitfehler da ich mit ptr1[5] auf irgendeinen speicher zugreife , nicht aber auf die einzelnen elemente des strings !
und ich möchte auch keinen string schreiben sondern nur einen char in einem string verändern - und das über einen pointer !
0

#6 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 22. April 2005 - 16:16

Dann lass doch ptr1 erstmal auf etwas zeigen. Derzeit ist ptr1 vom Typ Zeiger auf Char, zeigt auf die Adresse ((int)"10 spaces") und hat genau gar keine Beziehung zu dem Array.

Was du willst sieht eher so aus:

char array[10];
char[10] * ptr1 = &array;
(ptr1*)="10 spaces";
array[5] = 'A';
(ptr1*)[5] = 'B';

Dieser Beitrag wurde von Rika bearbeitet: 22. April 2005 - 16:18

Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#7 Mitglied ist offline   dcom 

  • Gruppe: aktive Mitglieder
  • Beiträge: 127
  • Beigetreten: 11. Juli 04
  • Reputation: 0

geschrieben 22. April 2005 - 17:12

vom syntax ist das aber so nicht ok !
char[10] -> was soll denn das sein ?
ich glaube was du meinst geht eigentlich so :

char array[10]="123456789";
char *ptr1 = "10 spaces";
char *ptr2;

ptr2=array;
ptr2[5]='a';


aber meine eigentliche frage bezog sich auf den teil aus meinem skript den ich vorher schon gepostet habe !
denn da ist ptr1[5]='B'; vom syntax ok aber es gibt einen fehler beim ausführen !
und wenn es einen fehler bei der ausführung gibt was soll mir das dann bringen ?
genau wie diese zeile :
ptr1[5] = 'C'; /* "legal" but runtime error due */
/* to prior assignment of */
/* of 2-character string */
da gibt es auch einen fehler wenn vorher kein 2-character string assigned wird !


hier noch ein solches problem :
char *ps = "a";

*ps = 'a'; /*Char Konstante wird
dereferenziertem Pointer auf char
zugewiesen*/

das ist quasi das gleiche - syntax is ok aber runtime error beim ausführen des programmes !

Dieser Beitrag wurde von dcom bearbeitet: 22. April 2005 - 17:43

0

#8 Mitglied ist offline   XDestroy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.911
  • Beigetreten: 08. August 02
  • Reputation: 0

geschrieben 22. April 2005 - 21:45

bitte wörter wie array und char nicht für eigene attribute verwenden.
zum quelltext:
ich gehe mal nun bei der ersten antwort auf deine erste frage vom anfang aus. die funktionierende variante davon wäre:

#include <stdlib.h>
#include <iostream>
using namespace std;
int main( void )
{
char ptr1[] = "10 spaces";
ptr1[5]='a';
return 0;
}

nun wirst du sagen das du über den pointer initialisieren will, richtig? da möchte ich wissen warum, denn für strings gibt es nunmal die möglichkeit der arrays. machst du es über den pointer hast du den speicher ja nicht reserviert. im grunde ist das wie ein zugreifen auf ein arra-yelement das du nicht initialisiert hast. c erlaubt bekanntlich das schreiben über das reservierte array hinaus. das traurige ist, dass sowas oftmals erst bei der laufzeit raus kommt. es hängt bei solchen sachen vom befehl und verwendeter library ab.

generell kann man sagen das dein quelltext daoben (er ist, das hoffe ich, nur ein test-text) nie so in der praxis zu finden sein sollte, weil das eine absolute sauerei ist.

@rika: dein text wird mir nicht schlüssig. z.b. char[10] * ptr1 = &array;
nicht nur die deklaration ist mir fremd, auch ist die zuweisung doppelt gemoppelt.
0

#9 Mitglied ist offline   dcom 

  • Gruppe: aktive Mitglieder
  • Beiträge: 127
  • Beigetreten: 11. Juli 04
  • Reputation: 0

geschrieben 23. April 2005 - 01:29

@xdestroy
also ein include <iostream> ist dem c compiler nicht bekannt !
kann es sein das es aus c++ stammt ?
und
using namespace std;
was soll denn das sein ? syntax nicht ok !
naja und du hast in deinem code auch keinen pointer sondern nur ein array !
ich hab mir das alles ja nicht selber ausgedacht sonder es steht - wie schon gesagt - in meinem c skript !
hier nochmal der code aus dem skript :


#include <stdlib.h>
int main( void )
{
char array[10];
char *ptr1 = "10 spaces";
char *ptr2;
array = "not OK"; /* cannot assign to an address */
/* of an array */
array[5] = 'A'; /* OK */
ptr1[5] = 'B'; /* OK */
ptr1 = "OK"; /* original string ist lost in */
/* memory! */
ptr1[5] = 'C'; /* "legal" but runtime error due */
/* to prior assignment of */
/* of 2-character string */
*ptr2 = "not OK"; /* type mismatch */
ptr2 = "OK"; /* OK although ptr2 was not */
/* initialized */
exit( 0 );
}


zitat : generell kann man sagen das dein quelltext daoben (er ist, das hoffe ich, nur ein test-text)
welchen code "daoben" meinst du ?
0

#10 Mitglied ist offline   XDestroy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.911
  • Beigetreten: 08. August 02
  • Reputation: 0

geschrieben 23. April 2005 - 09:58

das iostream und namespace ist aus c++ aber weiterhin unerheblich. du kannst es auch weglassen es steht nur drin, wegen der ausgabebefehle in c++. zum array: ein array ist im grunde nichts anderes als ein geordneter pointer. arrays und pointer sind sehr eng miteinander verbunden und weisen viele ähnliche eigenschaften auf. sie sind z.b. dafür da, unsichere dinge wie pointer-arithmetik zu vermeiden. die ist zwar manchmal hilfreich, wenn möglich sollte man aber ein array verwenden. bei strings sieht das genau so aus. du musst erstmal ein array deklarieren und damit die einzelnen char-variablen auf dem stack reservieren sonst schmiert das früher oder später ab.

mit daoben meinte ich den erstn langen, eingegangen bin ich aber auf das problem einen post von dir davor (der erste).
0

#11 Mitglied ist offline   dcom 

  • Gruppe: aktive Mitglieder
  • Beiträge: 127
  • Beigetreten: 11. Juli 04
  • Reputation: 0

geschrieben 23. April 2005 - 10:33

meine fragen bezogen sich eigentlich nicht auf arrays sondern nur auf die eine zeile mit dem pointer - und dieser pointer hat in meinem beispiel eigentlich nicht viel mit einem array zu tun !

ptr1[5] = 'B'; /* OK */

frage : warum ist das *OK* wenn es einen runtime error gibt ?!

oder :

char *ps = "a";
*ps = 'a'; /*Char Konstante wird dereferenziertem Pointer auf char zugewiesen*/
0

#12 Mitglied ist offline   XDestroy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.911
  • Beigetreten: 08. August 02
  • Reputation: 0

geschrieben 23. April 2005 - 17:34

ja aber was du da machst ist ja im grunde ein verwenden von speicher, der die nicht gehört. ein array sind mehrere pointer wenn du es so willst. wenn du nun
char *ps = "a";
*ps = 'a';
schreibst, schreibst du in einen bereich, der dir nicht reserviert wurde.
würdest du
char *ps = 'a';
*ps = 'a';
würde er abstürzen, weil er die char nicht hat. bei deinem fall sagt er nur nix, weil er einen string schreibt und dahinter die 0 setzt. Problem ist, du hast den speicher nicht. Daher schmiert er unweigerlich ab, weil du Bereich auf dem Stack anfasst, der nicht den Zeichen gehört.
0

#13 Mitglied ist offline   guard 

  • Gruppe: Mitglieder
  • Beiträge: 6
  • Beigetreten: 22. April 05
  • Reputation: 0
  • Interessen:C/C++<br />SDL<br />GTK

geschrieben 25. April 2005 - 09:20

Hallo noch mal!

Habe hier jetzt mal vor Langerweile eine Version verfasst, die lauffähig sein sollte:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main( void )
{
   char arry[10];
   char ptr1[] = "10 spaces";
   char* ptr2;

   strcpy( array, "not OK" );
   array[5] = 'A';

   *( ptr1 + 5 ) = 'B';

   strcpy( ptr1, "OK" );
   *( ptr1 + 5 ) = 'C';

   if( ( ptr2 = malloc( 6 ) ) != NULL )
      strcpy( ptr2, "not OK" );

   else
   {
      fprintf( stderr, "Couldn't allocate memory!\n" );
      free( ptr2 );
      return EXIT_FAILURE;
   }

   free( ptr2 );

   return EXIT_SUCCESS;
}

Mich würde ja mal interessieren, woher du diesen seltsamen Code hast. Hast du dir den etwa selbst geschrieben ? Wenn ja, dann solltest du den Abschnitt "Arrays und Pointer" noch mal üben.

edit: Das dein Code einen SIGSEGV auslöst, weißt du ja. Nun solltest du auch mal nachschauen, was genau das bedeutet, und du wirst vielleicht bemerken, dass du mit ptr1 auf geschützten Speicher zugreifst - darum auch der Error :band:

So long ...

Dieser Beitrag wurde von guard bearbeitet: 25. April 2005 - 09:58

0

#14 Mitglied ist offline   dcom 

  • Gruppe: aktive Mitglieder
  • Beiträge: 127
  • Beigetreten: 11. Juli 04
  • Reputation: 0

geschrieben 02. Mai 2005 - 10:45

naja so wirklich verstanden hab ich es irgendwie noch nicht ....
@guard - gibt einen syntakfehler beim ersten strcpy !

und hierzu :
*( ptr1 + 5 ) = 'B';
das sollte doch das gleiche sein : s[i] = *(s + i)
ist es aber irgendwie nicht ...
da greifst du doch auch auf "irgendeinen" speicherbereich zu - oder nicht ?
und nochmal :
habe mir den code nicht selber ausgedacht !!!!!
der stammt aus einem c-Skript !
und genau solche fragen sind auch in der c-prüfung drangekommen !!!
deshalb versuche ich es zu verstehen !
0

#15 Mitglied ist offline   guard 

  • Gruppe: Mitglieder
  • Beiträge: 6
  • Beigetreten: 22. April 05
  • Reputation: 0
  • Interessen:C/C++<br />SDL<br />GTK

geschrieben 09. Mai 2005 - 18:35

Noch mals hi!

@dcom: wenn du einen Variable via
char* ptr = "Hello World!";
anlegst (Stichwort Stringliterale), dann arbeitest du in dem Falle mit Read-Only-Speicher. Daher kommt der SegFault bei dir im Programm.

So long ...
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0