0

私は割り当てに取り組んでいますがmain、変更が許可されていないため、次のコードでセグメンテーション違反が発生し続けています。

char signal[61];

Seti t2A(data, rF, rA, rB); // call constructor

t2A.getMessage(signal);            // calling member functions
t2A.getRanges(&pA, &pB);

usrF = t2A.getFrequency( );

if(strcmp(signal, correct)) { // <-- this is where i get segmentation fault.

Setiクラスの実装:

class Seti {
    char signal[61];
    int freq;
    int a, b;
public:
    Seti(const char [ ], int, int, int);
    Seti();
    int getFrequency( );
    void getRanges(int *, int *);
    void setRanges(int , int );
    void getMessage(char *);
    bool replaceChar(int , char );
    bool copyPrimes(char *);
    bool copyFibonacci(char *);
    int initCap( );
    friend Seti join(Seti, Seti);
};

そしてgetMessage:の実装

 void Seti::getMessage(char *pSignal) {
 strcpy (pSignal, signal);
 return;
 }

その後、メインのifステートメントでセグメンテーション違反が発生するのはなぜですか?

4

1 に答える 1

1

そのコードから、Seti::signal初期化されていないために適切にnullで終了していない可能性があり、strcpyメモリが破損します。これにより、未定義の動作が発生します。これは幸いなことにセグメンテーション違反です。

(最後の配列インデックスにstrncpy終了文字を自分で追加することを忘れないでください)またはの代わりに、また。の代わりに使用してください。'\0'snprintfstrcpystrncmpstrcmp

編集:ああ、correctあなたのコメントに基づいて、結局はNULLです(「NON-SEQUITOR」ではありません)。さて、あなたの問題があります。1つではなくその名前の2つの変数がある可能性がありますか(一般的な初心者の間違い)?

ただし、バッファサイズの指定を可能にする関数の使用に関する上記の提案は引き続き有効です。

コメントによる編集:strncpy間違いを避けるために、このように機能するように折り返すと便利です。

char *strncpy0(char *dst, const char *src, size_t n) {
  dst[n-1] = 0;
  return strncpy(dst, src, n-1);
}
于 2013-03-01T20:57:25.880 に答える