2017-03-25 17 views
1

セグメント化エラーが発生している次のコードを実行しようとしています。私は何をしているのですか?このコードは他の方法で実装できますか?次のコードでセグメント化エラーが発生しています

コード:あなたは文字列定数に

structが割り当てられて持っているstruct A x;の使用とするだけでなく、ポインタを割り当てるためconst char *

使用:ここで

#include <iostream> 
#include "string.h" 

using namespace std; 

struct A { 
    char* a; 
}; 

int main() 
{ 
    struct A *x; 
    x->a = "soumya"; 
    char* str = "soumya"; 
    cout<<str<<endl<<(char*)x->a<<endl; 
    // if(strcmp(x->a,str)!=0) 
    // { 
    //  cout<<"not same"<<endl; 
    // } 

    return 0; 
} 
+0

ないC++の第一人者でなければなりませんが、私はあなたがそれを初期化する前に、変数を利用しようとしているように見える推測していた(と場合、私はそれが可能だろうか分かりませんコード体の中の 'struct'キーワードの正しい使い方) – Rogue

+0

' struct A * x; '//初期化されていないワイルドポインタ ' x-> a = "soumya"; '//災害への招待;プロセス空間外のアドレスにアクセスし、OS 'A * x = new A 'によって発行されたセグメンテーションフォールトで終わり、後で' delete A'を使用してメモリリークを回避します。 – vivekn

+0

[セグメンテーションフォルトの一般的な理由の確定リスト]の可能な複製(http://stackoverflow.com/questions/33047452/definitive-list-of-common-reasons-for-segmentation-faults) – Barmar

答えて

4

あなたはstruct Axポインタを初期化していないので、最初はそれが割り当てられていないメモリ内のいくつかの未定義の領域を指します。

したがって、x->a = "soumya";を実行すると、この領域を書き込もうとしているため、セグメント化エラーが発生します。それは自動的になりますので

あなたは

struct A *x = malloc(sizeof(struct A)); 
// Don't forget to free this memory if your program is going to run for some time 

または

struct A x; 

への

struct A *x; 

を変更し、この場合、メモリにx.aですべてのx->aを置き換えることができますが、スタックに割り当てられていますメソッドの最後に解放されます。

1

が修正バージョンです割り当てられていないメモリ。

#include <iostream> 
#include "string.h" 
using namespace std; 
struct A { 
    const char* a; 
}; 
int main() 
{ 
    struct A x; 
    x.a = "soumya"; 
    const char* str = "soumya"; 
    cout<<str<<endl<<x.a<<endl; 

    return 0; 
} 
2

私たちがカバーする必要があるいくつかの問題があります。

1)一般的に、C++では未使用のポインタを使用しないでください。

2)実際には*xのメモリを割り当てていません。

struct A *x = new A; 

は、適切なときにメモリを解放するために、delete xを呼び出すことを忘れないでください:これはやっによって達成することができます。

第3の問題は、x->aのコンテンツにメモリを割り当てないことです。最適な解決策は、charポインタの代わりにstd::stringを使用することです。 その後、あなたはx->a = "soumya";を行うことができます。

あなた構造体は、その後、

struct A { 
    std::string a; 
}; 
関連する問題