Próbuję podzielić ciąg na „tmp” iumieść go w tablicy wskaźników „arr”. Robię to, ponieważ zamierzam użyć „execv” na „arr”, ale nie mogę tego zrobić, ponieważ „arr” na końcu nie ma wartości NULL. Zamiast tego ma „(zerowy)”, a kiedy drukuję jego zawartość, pojawia się błąd segmentacji. Jak ustawić poprawnie „arr”, aby można go było używać z execv? Dzięki
#include<stdio.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<string.h>
int main(){
char tmp[40] = "echo Hello World n ";
char *arr[40];
char *token = strtok(tmp, " n");
int index = 0;
while(token != NULL){
arr[index] = malloc(strlen(token) + 1);
arr[index] = token;
index = index + 1;
token = strtok(NULL, " n");
}
for(int i = 0; i < 40; i++){
printf("%s n", arr[i], arr[i]);
}
return 0;
}
Odpowiedzi:
2 dla odpowiedzi № 1Oto duży problem:
arr[index] = malloc(strlen(token) + 1);
arr[index] = token;
Nie kopiujesz łańcucha, zamiast tego nadpisujesz wskaźnik. Powinieneś użyć strcpy
aby skopiować ciąg:
strcpy(arr[index], token);
W takim przypadku może nie być konieczne kopiowanie ciągów, wystarczy przypisanie. Oznacza to również, że przydział nie jest potrzebny.
Istnieje również inny problem z twoim kodem: Pętla, w której drukujesz ciągi arr
.
Przy takim ciągu powinieneś mieć tylko trzy elementy ważne w arr
, reszta zostanie niezainicjowana i nieokreślony. Dereferencje (tak jak robisz to przy próbie wydrukowania „ciągów”, na które wskazują) doprowadzą do niezdefiniowane zachowanie.
Po poprzedniej pętli, gdzie inicjujesz arr
, następnie index
będzie liczbą prawidłowych elementów w arr
. Użyj tego jako końca pętli drukowania:
for(int i = 0; i < index; i++){ ... }