Noobie Frage In C !
#1
geschrieben 20. April 2005 - 18:10
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 ?
Anzeige
#2
geschrieben 20. April 2005 - 18:17
Ja, mata ne!
(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
#3
geschrieben 20. April 2005 - 18:23
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
#4
geschrieben 22. April 2005 - 07:53
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
[/edit]
Vielleicht das als kleine Hilfestellung
So long ...
Dieser Beitrag wurde von guard bearbeitet: 22. April 2005 - 07:59
#5
geschrieben 22. April 2005 - 14:45
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 !
#6
geschrieben 22. April 2005 - 16:16
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
Ja, mata ne!
(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
#7
geschrieben 22. April 2005 - 17:12
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
#8
geschrieben 22. April 2005 - 21:45
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.
#9
geschrieben 23. April 2005 - 01:29
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 ?
#10
geschrieben 23. April 2005 - 09:58
mit daoben meinte ich den erstn langen, eingegangen bin ich aber auf das problem einen post von dir davor (der erste).
#11
geschrieben 23. April 2005 - 10:33
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*/
#12
geschrieben 23. April 2005 - 17:34
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.
#13
geschrieben 25. April 2005 - 09:20
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
So long ...
Dieser Beitrag wurde von guard bearbeitet: 25. April 2005 - 09:58
#14
geschrieben 02. Mai 2005 - 10:45
@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 !
#15
geschrieben 09. Mai 2005 - 18:35
@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 ...