2016-04-05 24 views
0

Yığın Smash Protection ile ilgili bazı ciddi sorunlar yaşıyorum ve şimdi yeni bir hata alıyorum -Segmentation fault-. Linux'un bazı özel korumalara sahip olmasıyla çok ilgili olduğunu düşünüyorum. Herkes bana açıklayabilir mi, bu özel vakada neden Segmentasyon hatası alıyorum?Okuma işlevindeki bölümleme hatası

vector<const char*> Words; 
void read(){ 
    FILE* a; 
    char s[100]; 
    a = fopen("text.txt", "r"); 
    while (!feof(a)) 
    { 
     fgets(s, 100, a); 
     char *newAlloc = new char[strlen(s)]; 
     strcpy(newAlloc, s); 
     Words.push_back(newAlloc); 
    } 
    fclose(a); 
} 

güncelleme: Ben tüm çözümleri denedim ve kod modifiye ancak sorun hala var, bu yüzden bu kod azaltmak için çalıştı: Hala bana bu hata veriyor

#include<iostream> 
#include<stdio.h> 

int main() 
{ 

FILE* a; 
a=fopen("text.txt", "r"); 
fclose(a); 

} 

Fopen ile satırda (Ben çözdüğüm alıştırmada zorunlu olan) - GCC derleyicisi ile birlikte Ubuntu 15.10 ve QT Creator kullanıyorum.

Güncelleme: Çözüldü. Sanırım sorun şu ki, fopen'e tam yol vermedim. Ubuntu ile yeniyim. Görünüşe göre farklı şeyler var.

+2

Ne C ve C arasındaki şerli karışımı ++. C stili dizelerden kurtulun, bunları std :: string' ile değiştirin ve sorunlarınızdan kurtulacaksınız. Dosya tabanlı IO için de aynısını yapın (şu anda nullptr olabilecek döndürülen işaretçiyi işaretlemiyorsunuz). – SergeyA

cevap

3

Birkaç sorun görüyorum.

  1. while (!foeof(a))'u kullanmayın. Bakınız Why is “while (!feof (file))” always wrong?.

  2. Sözlüğe yeterli bellek ayırmıyorsunuz. Sonuç olarak, yapmanız gerekmediği belleği kullanarak sonuçlanırsınız. Bu, tanımlanmamış davranışlara yol açar.

Kullanım:

while (fgets(s, 100, a)) 
{ 
    char *newAlloc = new char[strlen(s) + 1]; // Add +1 for the terminating null character. 
    strcpy(newAlloc, s); 
    Words.push_back(newAlloc); 
} 
+1

Neden strdup() '' char * t = malloc (strlen (s) + 1) yerine strcpy (t, s); 'desen (veya belki de Desen). –

+0

@MichaelBurr Büyük olasılıkla standart bir kütüphane işlevi olmadığından. –

+0

Muhtemelen haklısınız. Ancak bunu (veya eşdeğer) bir kez yazmak ve sonsuza kadar böyle hataları önlemek çok kolay. SO sorularına dayanarak, bu, insanları çok ısırtan bir şey. Yeni başlayanların bile muhtemelen istedikleriden biraz daha fazla olduğunu düşünüyorum. –