Segmentation Fault bei Kopiervorgang in ein 2D Arrays
-
Hallo zusammen,
ich hantiere gerade (auch zur Übung) mit 2D Arrays herum. Dass ich keine std::vector benutze ist beabsichtigt. Ich möchte nun den kompletten Inhalt eines Arrays in ein anderes kopieren. Irgendwie wird dieser Kopiervorgang aber nicht außerhalb der Kopiermethode sichtbar:
//Methode kopiert private 2D Array num2convert in cp_pointer void myclass::cp_num2pointer(unsigned short** cp_pointer) { cp_pointer = new unsigned short*[length+1]; for(int i = 0; i <= length; i++) { cp_pointer[i] = new unsigned short[2]; cp_pointer[i][0] = num2convert[i][0]; cp_pointer[i][1] = num2convert[i][1]; std::cout << cp_pointer[i][0]; //kein Problem! } } //in der Aufrufermethode: unsigned short** curr_arr, nx_level_arr; cp_num2pointer(curr_arr); for(int i = 0; i < length; i++) //ein Element weniger ausgeben std::cout << curr_arr[i][0]; //Segmentation FaultWarum ist der Kopiervorgang in der Fehlerzeile anscheinend ohne Wirkung geblieben?
Könnt ihr mir helfen?
Danke
-
Wegen Call-by-Value.
-
Daran hatte ich auch gedacht, aber ich übergebe doch einen Zeiger?!
-
Ok, du hattest Recht. Ich hab nun einfach eine Referenz übergeben. Die Methodensignatur sieht jetzt so aus:
void myclass::cp_num2pointer(unsigned short**& cp_pointer)Nur aus Interesse. Wie sähe der Code aus, wenn ich eine Pointer übergeben wollte? Mit einem unsigned short*** hat es bei mir nicht geklappt.
Vielen Dank
LG, freakC++
-
freakC++ schrieb:
Daran hatte ich auch gedacht, aber ich übergebe doch einen Zeiger?!
Es kommt nicht drauf an, dass du irgendeinen Zeiger übergibst. Wenn du willst, dass sich außerhalb der Funktion etwas ändert, musst du einen Zeiger auf das, was sich ändern soll, übergeben (oder halt eine Referenz).
Wie sähe der Code aus, wenn ich eine Pointer übergeben wollte?
//Methode kopiert private 2D Array num2convert in cp_pointer void myclass::cp_num2pointer(unsigned short*** cp_pointer) { *cp_pointer = new unsigned short*[length+1]; for(int i = 0; i <= length; i++) { (*cp_pointer)[i] = new unsigned short[2]; (*cp_pointer)[i][0] = num2convert[i][0]; (*cp_pointer)[i][1] = num2convert[i][1]; std::cout << (*cp_pointer)[i][0]; //kein Problem! } } //in der Aufrufermethode: unsigned short** curr_arr, nx_level_arr; cp_num2pointer(&curr_arr); for(int i = 0; i < length; i++) //ein Element weniger ausgeben std::cout << curr_arr[i][0]; //Segmentation Fault
-
ah...die Klammern hatten bei mir gefehlt

Danke
lg, freakC++
-
Da die innere Dimension bekannt ist:
int (*myclass::cp_num2pointer())[2] { int (*cp_pointer[2]) = new unsigned short[length + 1][2]; for(int i = 0; i <= length; ++i) { cp_pointer[i][0] = num2convert[i][0]; cp_pointer[i][1] = num2convert[i][1]; std::cout << cp_pointer[i][0]; //kein Problem! } return cp_pointer; } ... int (*curr_arr)[2] = cp_num2pointer();Bzw.
typedef int two_numbers[2]; two_numbers *myclass::cp_num2pointer() { two_numbers *cp_pointer = new two_numbers[length + 1]; // usw. } two_numbers *curr_arr = cp_num2pointer();Allerdings wäre es vermutlich sinnvoller, statt nackter Zeiger
std::vector<std::array<int, 2>> myclass::cp_num2pointer() { std::vector<std::array<int, 2>> cp(length + 1); for(int i = 0; i <= length; ++i) { cp[i][0] = num2convert[i][0]; cp[i][1] = num2convert[i][1]; std::cout << cp[i][0]; //kein Problem! } return cp; }zu schreiben; dann musst du dich um die Aufräumarbeit hinterher nicht mehr kümmern.