C char array an einem index ändern

bywizard

Lieutenant
Registriert
Okt. 2018
Beiträge
537
ich habe eine methode
C:
void change_string(char input[])
und muss in dieser methode input an der dritten stelle zu "\0" ändern.
Hier ist die Angabe vom Professor:
Define a function change_string which accepts a string as a parameter. The function shall change the third char of string to \0.

Mein Ansatz wäre jetzt folgender:
C:
void change_string(char input[])
{
    input[3] = '\0';
}

jedoch kriege ich hiere eine segmentation fault. da ich noch ein c anfänger bin weiss ich nicht wirklich wie ich das lösen soll.
Habt ihr ideen?
 
An sich bist du schon auf der richtigen Spur. Ein Segmentation Fault tritt z.B. auf, wenn du versuchst, auf einen Index im Array zuzugreifen, der ueber die Laenge des Arrays hinausgeht. Auf deinen Fall bezogen muesstest du also herausfinden, ob dein Array ueberhaupt Platz fuer vier (Indizes 0 ... 3) Elemente bietet. Sollte dem nicht so sein, kannst du natuerlich nicht auf das vierte Element zugreifen. Stichwort zur Suche: C Array Bounds Checking.

Edit 1: Mein C ist sehr rostig. Das Durchgestrichene stimmt schon, allerdings ist das nicht die Ursache des Problems in deinem Fall. Muss ich selbst erstmal ausprobieren. Sorry!

Edit 2: Entschuldige die Verwirrung. Das Gesagte stimmt soweit doch. Zeig mal deinen Code, wie uebergibst du das Char Array an die change_string Funktion?
 
Zuletzt bearbeitet:
Und du kannst kein String Literal ("string") an die Funktion selbst übergeben, da dies einem const char Pointer entspricht und diese nicht verändert werden können.
 
  • Gefällt mir
Reaktionen: M4ttX
Hast du verstanden, wie ein String in C abgespeichert wird? Wie lang ist dein String? Hat er überhaupt eine dritte Stelle? Welchen Index hat die dritte Stelle? Was passiert mit dem String wenn du irgendwo Nullbytes reinschreibst?
Wenn du das alles beantworten kannst sollte deine Aufgabe einfacher werden :)
 
  • Gefällt mir
Reaktionen: Nero1
habs grade getetst. wenn ich in der methode dem char einen text zuweise gehts. danke
Ergänzung ()

up.whatever schrieb:
Hast du verstanden, wie ein String in C abgespeichert wird? Wie lang ist dein String? Hat er überhaupt eine dritte Stelle? Welchen Index hat die dritte Stelle? Was passiert mit dem String wenn du irgendwo Nullbytes reinschreibst?
Wenn du das alles beantworten kannst sollte deine Aufgabe einfacher werden :)
unser lehrer hat es uns nicht wirklich erklärt und uns einfach die aufgabe gegeben deswegen muss ich es mir selber beibringen aber danke hab den fehler gefunden
 
bywizard schrieb:
hab den fehler gefunden
Ich hoffe dir ist dabei auch aufgefallen, dass input[3] nicht die dritte Stelle manipuliert :D
 
  • Gefällt mir
Reaktionen: M4ttX und eigsi124
@m.c.ignaz : Nein, der Compiler macht da eben nichts. Deshalb geht es nicht kaputt. In C sind Arrays nichts weiter als Zeiger auf eine Adresse und Strings sind Chararrays an deren Ende eine '\0' steht.

Mit input[0] zeigst du auf den Datenwert am Anfang des Zeigers. input[1] ist um die Länge des Datentyps von input nach hinten verschoben, bei Char um 1 Byte. input[3] dann entsprechend um 3 Byte.
Du initialisierst input mit einem leeren String. Damit ist input[0] definiert als '\0'. Mit input[3] greifst du auf eine Adresse 3 Byte hinter deinem Array-Ende zu. Ist diese Adresse von deinem Programm aus zugreifbar (ist sie, siehe unten), dann werden die Daten dort mit dem input[3]='A' überschrieben.

Du beschreibst Daten, von denen du nicht weißt, was dort liegt und wozu die gehören, auf die dein Programm aber zugreifen darf. Dein Output ist aber trotzdem leer, da dein Chararray an erster Stelle eine '\0' enthält, also das Ende eines Strings. Die Daten dahinter werden nicht mehr beachtet, auch wenn sie noch existieren.

Das funktioniert übrigens, weil Speicherzuweisungen, wie du sie z.B. mit = "" implizit erzeugst, nur in Blöcken Speicher zuweisen können, nicht Byte-genau. In Visual C++ kannst du nur Blöcke von mindestens 8 Byte reservieren, wie sich andere C-Sprachen verhalten weiß ich nicht sicher - vermutlich aber ebenfalls 8 oder wenigstens 4 Byte. Der Speicher, auf den du zugreifst, gehört also tatsächlich zu deinem Programm, auch wenn du das nicht explizit angegeben hast.
 
Das hier
C++:
#include <iostream>

#define STACK_BYTE_ALIGNMENT 8

void check(char input[])
{
input[1 + STACK_BYTE_ALIGNMENT] = 'A';
std::cout << input << std::endl;
}

int main()
{
char stack_above_a[] = "\0\0";
char a[] = "";
check(a);
std::cout << stack_above_a << std::endl;
return 0;
}
schreibt das 'A' "kontrollliert" in die Variable über a - jedenfalls bei meinem VS 2019 C++ mit Debug Stack. Mit #define STACK_BYTE_ALIGNMENT 0 geht das wahrscheinlich auch bei diesem Web-Dingens, wenn da gcc verwendet wird. So funktioniert "hacking", man muss nur die Stack-Datenabstände auf der Zielmaschine kennen. Ich könnte zum Beispiel auch die Rücksprungadresse von check() umschreiben und auf meinen "kriminellen" Code umleiten.
 
Zuletzt bearbeitet:
Zurück
Oben