W poniższym kodzie, linia:Segmentacja wina - char wskaźnik
*end = *front;
daje winy segmentacji. Zadałem podobne pytanie: here, ale nie jestem pewien, czy to dlatego, że mam dwie kopie num. Proszę wyjaśnić, dlaczego jest to wadliwe. Dziękuję Ci.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* getPalin(char* num);
int main()
{
char* num = (char*)malloc(100);
num = "123456";
printf("%s\n", getPalin(num));
return 0;
}
char* getPalin(char* num)
{
int length = strlen(num);
if (length % 2 == 0)
{
char* front = num;
char* end = num + strlen(num) - 1; //pointer to end
while(front != num + (length/2)) //pointers not middle yet
{
*end = *front;
printf("%c", *end);
front++;
end--;
}
}
return num;
}
Niestety, nie sizeof (num), ale rozmiar przydzielonej pamięci, czyli 100. I.e. strncpy (liczba, "123456", 100); – Konstantin
OP poprosił o wyjaśnienie, ale dałeś tylko rozwiązanie. I nigdy nie zapomnij ręcznie dodać null-terminator po strncpy, ponieważ nie ma gwarancji, że strncpy je doda. Wiem, że nie ma to znaczenia w tym przykładzie, ponieważ "123456" jest krótszy niż 100 bajtów, ale jeśli zdecydowałeś się użyć strncpy zamiast strcpy, używaj go właściwie - uniknąłeś jednego potencjalnego problemu (przepełnienie bufora), ale wprowadziłeś inny (ciąg bez znaku) . – qrdl
@qrdl - Jeśli rozmiar docelowy określony w strncpy jest większy niż długość łańcucha, strncpy automatycznie wyrówna się z pustymi znakami. Dopiero, gdy rozmiar docelowy jest określony jako mniejszy niż długość ciągu, który ma być skopiowany, można pominąć terminator o wartości zero. Innym piontem jest pamiętać, że strncpy NIE sprawdzi, czy w pamięci docelowej jest wystarczająca ilość miejsca. Tak więc przypuszczam, że strncpy (liczba, "123456", sizeof (num)) byłoby bardziej poprawne. – ChrisBD