2016-04-05 18 views
0

スタックスマッシュプロテクションに深刻な問題があり、今では新しいエラーが発生します。 Linuxには特別な保護があるという事実に強く関係していると思います。誰も私に説明してくださいなぜ私はこの特定のケースでセグメンテーションフォルトを得るのですか?読み取り機能上のセグメンテーションフォルト

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); 
} 

アップデート:私はすべてのソリューションを試してみましたが、コードを変更しますが、問題がまだあるので、私はこれにコードを削減しようとした:それはまだ私にそのエラーを与える

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

int main() 
{ 

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

} 

を(私は解決している練習で必須です) - 私はUbuntu 15.10とQT CreatorをGCCコンパイラと共に使用しています。

更新:解決しました。私はfopenへの完全な道を与えなかったので問題があったと思う。私はubuntuで新しいです。どうやらいくつかの違いがあります。

char * a = "/home/codrinz/text.txt"; 
FILE * file = fopen(a, "r"); 
+2

何CおよびC++の不浄ミックス。 Cスタイルの文字列を取り除き、 'std :: string'で置き換えると、問題を取り除くことができます。ファイルベースのIOに対しても同様の処理を行います(今はnullptrである可能性のある返されたポインタをチェックしません)。 – SergeyA

答えて

3

私はいくつかの問題を抱えています。

  1. while (!foeof(a))を使用しないでください。 Why is “while (!feof (file))” always wrong?を参照してください。

  2. 単語に十分なメモリを割り当てていません。結果として、あなたはあなたが想定していないメモリを使用することになります。これは未定義の動作につながります。

用途:

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

私は 'char * t = malloc(strlen(s)+ 1); strcpy(t、s);パターン(または多分anti-パターン)。 –

+0

@MichaelBurrおそらく標準ライブラリ関数ではないためです。 –

+0

あなたはおそらく正しいでしょう。しかし、それを一度書く(または同等の方法で)のが一度簡単で、このようなバグは永遠に避けてください。 SOの質問に基づいて、これは人々をたくさん刺すようなものです。私は、初心者でなくても、おそらくもっと好きになると思うのです。 –

関連する問題