[Çözüldü] Buradaki yanlış ne?

Başlatan MetinErsin, 11 Ağustos 2016 - 16:49:03

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

MetinErsin

#include <stdio.h>
#include <stdlib.h>

void slide(void *p1, int i, int j);

int main()
{
     char* p = "Hello world!";
     printf("%s\n", p);
     slide(p, 1, 6);
     printf("%s\n", p);
     return 0;
     }
void slide(void *p1, int i, int j)
{
     char *vp = p1 + j;
     char c = *vp;
     int n = j - i;
     while(n--)
     {
          *vp = *(vp - 1); //Tam burada sigsegv segmentation fault hatası veriyo. Ama burada ne varki
                                   //analamadım neden hata vardiğini.
          vp--;
     }
     *vp = c;
}
Programıng amacınını da açıklayayım, verilen bir array deki i ile j indexlerinin yerini kaydırarak değiştirmek.
mesela
Hello world! ve i = 1, j = 6 girdileri için string
Hwello orld! haline dönüşecek.


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 11 Ağustos 2016 - 17:47:12

Hatanın neden kaynaklandığını çözdüm. Belki başkasının da başına gelir diye buraya yazıyorum.
Hatanın asıl nedeni main fonksiyonundaki ilk atamada
char *p = "Hello world!";
atamasında "Hello world!" stringi için bellekten salt okunur bellekte(ROM) yer açılıyormuş. Bu açalıan salt okunur belleğin adresini p ye aktarıyormuş.
slide fonksiyonunda salt okunur bellekteki değeri değiştirmeye çalıştığı için hata oluşuyormuş.
Sorunun çözümü için main fonksiyonundaki atamayı şu şekilde değiştirdim.
char p[] = "Hello world!"; bu atamada ram de p için yer ayrılıyor bu ayrılan yere string yerleştirildiği için de sorun düzelmiş oluyor.

bugra9


char* p = "Hello world!";

şeklinde bir tanımlama ile derleyici sadece okunur olacak şekilde bellekte ayırma yapabilir. Yani değerlerini değiştirmeye çalıştığın anda "segmentation fault" hatası alırsın. Bunu
char p[] = "Hello world!";
şeklinde değiştirirsen çalışması lazım.

MetinErsin

Alıntı yapılan: bugra9 - 11 Ağustos 2016 - 17:48:35

char* p = "Hello world!";

şeklinde bir tanımlama ile derleyici sadece okunur olacak şekilde bellekte ayırma yapabilir. Yani değerlerini değiştirmeye çalıştığın anda "segmentation fault" hatası alırsın. Bunu
char p[] = "Hello world!";
şeklinde değiştirirsen çalışması lazım.

Aynn sağol yine de. Anladım az önce zor da olsa. Aynı anda mesaj yazdık herhalde

bugra9

Evet öyle olmuş. :D

Bu arada çözülen başlıkların etiketlenmesi için şöyle bir uygulamamız var.
https://forum.ubuntu-tr.net/index.php?topic=31789.0

MetinErsin

tmm etiketliyorum. Bilmiyordum iyi oldu.

bugra9

Etiket için teşekkürler, sorun çözüldüğüne göre konuyu kilitleyelim.