Problem beim Zugriff auf übergebenen Pointer

Kaiser206

Erfahrenes Mitglied
Hallo,
ich habe folgendes Programm geschrieben:

Code:
void test(char *abc)
{
    int i = 0;
    while (abc[i])
    {
        abc[i] = 'A';
        i++;
    }
}

int main()
{
  char* data = "dsdsdsdd";
  test(data);
    return 0;
}

Die Funktion Test soll alle werte von data durch A ersetzen.
Beim ausführen dieser Funktion, beendet sich das Programm aber mit einem Absturz.

Kann mir jemand sagen was der Fehler ist?

Danke im Vorraus

PS: es ist ein mit g++ kompiliertes programm unter windows.


---------------------
Edit:

das Problem tritt bereits bei dieser Vereinfachung auf:
Code:
void test(char *abc)
{
  abc[0] = 'A';
}
 
Zuletzt bearbeitet:
Vielleicht liegts daran:

test2.cc:15: warning: deprecated conversion from string constant to ‘char*’

Wenn du das so machst:
Code:
char* data = "dsdsdsdd";

ist dann "data" nicht eine Konstante?

So gehts dagegen:

Code:
void test(char *abc)
{
	int i = 0;
	while(abc[i])
	{
		abc[i] = 'A';
		i++;
	}
}

int main()
{	
	char data[] = "dsdsdsdd";
	char *ptr = data;

	test(ptr);
	return 0;
}

Schau mal hier, Post Nummer 11: http://bytes.com/forum/thread62034.html
Kannst du nicht "std::string" benutzen, wenn du schon mit g++ arbeitest?
 
Zuletzt bearbeitet:
Ok,
ich hätte nie gedacht, das ich je solche Anfängerfehler machen würde xD

Du hast natürlich absolut recht!
Und an soetwas sitze ich dann ~2 Stunden!

Code:
void test(char *abc)
{
	int i = 0;
	while(abc[i])
	{
		abc[i] = 'A';
		i++;
	}
}

int main()
{
  char* data;
  strcpy(data,"dsdsdsdd");    //<-----------
  test(data);
  return 0;
}

-----
Also der Fehler bestand eben darin, das ich die Variable als Konstante deklariert habe.
 
Zuletzt bearbeitet:
Code:
  char* data;
  strcpy(data,"dsdsdsdd");    //<-----------
  test(data);
Auha, ganz böser Code, dein compiler sendet dir auch bestimtm eine Fehler Meldung. das data nicht initalisiert wurde oder so.
Das Problem ist das wenn du irgendwo einen String angeibst "dsdsdsdd" wird dieser in einem schreib geschütze Bereich angelegt. Deswegen ist es NICHT möglich die Werte alle Auf 'A' zu ändern.
Was du jetzt machst ist den Kopiergeschützenbereich auf einen anderen Bereich zu kopiren, und zwar auf den, auf den *data zeigt. leider zeigt *data irgendwo hin.
Es gibt hier zwei möglichkeiten:
1.
anstatt char* data;
schreibst du char data[250];
Hier musst du aber wissen wie groß data ungefähr sein muss.
oder du
du weißt *data noch speicher bereich zu:
data = new char[strlen("dsdsdsdd")+1];
 
jaja ich weis. Das hier, war nur ein zugeschnittenes Beispiel meines Problems. Im richtigem Programm habe ich das natürlich nicht so gemacht.

Um das Beispiel zu vervollständigen:

Code:
void test(char *abc)
{
	int i = 0;
	while(abc[i])
	{
		abc[i] = 'A';
		i++;
	}
}

int main()
{
  char* data = (char*) malloc(sizeof(char)*strlen("dsdsdsdd")+1);
  strcpy(data,"dsdsdsdd");
  test(data);
  return 0;
}
Es geht natürlich auch mit new.
 
Zuletzt bearbeitet:
Code:
char* data = (char*) malloc(sizeof(char)*strlen("dsdsdsdd")+1);
strcpy(data,"dsdsdsdd");
Warum denn jetzt so umständlich? Du kannst doch "char data[] = "dsdsdsdd";" schreiben, wie von engelmarkus vorgeschlagen.

@engelmarkus
Man muss eigentlich nicht unbedingt extra noch eine Zeiger-Variable erzeugen. Man könnte auch gleich "test(data);" schreiben.

Gruß
MCoder
 
C++:
void test(char *abc)
{
	int i = 0;
	while(abc[i])
	{
		abc[i] = 'A';
		i++;
	}
}

int main()
{
  char* data = (char*) malloc(sizeof(char)*strlen("dsdsdsdd")+1);
  strcpy(data,"dsdsdsdd");
  test(data);
  return 0;
}
das ist immernoch falsch :P Du hast Speicher angefordert, aber nicht freigegeben! Und bei deinem Beispiel ist es durchaus ausreichend, den Stack zu nutzen.

Achja, und dein
C++:
void test(char *abc)
{
	int i = 0;
	while(abc[i])
	{
		abc[i] = 'A';
		i++;
	}
}
=> std::memset hilft.
 
Dieses Beispiel ist ein sehr stark zusammengeschnittener Teil aus meinem Programm. Es hat alles schon so seinen Sinn. Den string, das sieht man im Beispiel nicht, werde ich dann noch weiterverwenden. Ich habe das Beispiel überhaupt nur aufgeschrieben um den Fehler in ihm zu finden. Das es explizit für dieses Beispiel andere und bessere Lösungen geben kann weis ich, aber es ist mir absolut egal, da ich sie nunmal nicht in meinem Programm gebrauchen kann.

Und noch ein Anlauf...

Code:
int main()
{
  char* data = (char*) malloc(sizeof(char)*strlen("dsdsdsdd")+1);
  if(!data)
    return 0;
  strcpy(data,"dsdsdsdd");
  test(data);
  free(data);
  return 0;
}
 
Jo trotzdem kannste deine Funktion test durch std::memset ersetzen und sogar noch Performance dabei gewinnen!
 
ja in dem Beispiel. Im original, wird der string aber nicht geleert/gefüllt sondern modifiziert. Ich habe dieses Beispiel erstellt um den Fehler einzugrenzen.
 
Zurück