1

何らかの理由で、構造体のサイズを取得しようとすると、セグメンテーション違反が発生し続けます。

struct my_struct {
  char *a;
  int  b;
};

int main(int argc, char *argv[])
{
    struct my_struct dastruct;
    size_t len = sizeof(dastruct) / sizeof(struct my_struct); // error
    qsort(dastruct, len, sizeof(struct my_struct), cmp);
    ...
}

私が間違っていることはありますか?ありがとう

4

4 に答える 4

2

特にでクラッシュが発生している場合

size_t len = sizeof(dastruct) / sizeof(struct my_struct); 

行、それは0に評価することによって引き起こされる可能性がありますsizeof(struct my_struct)(つまり、問題は実際にはゼロによる除算です)。struct my_structこれは、型が不完全な場合、つまり定義されていない場合に、一部のコンパイラで発生する可能性があります。Cでは不完全な型を使用するsizeofことは違法ですが、一部のコンパイラは何らかの理由でそれを許可し、0と評価します(ただし、コンパイラはコンパイル時にこの除算を0でキャッチすることを期待しています)。

あなたのコードは明らかに偽物であり、問​​題を説明していません。上記の理論が正しければ、実際のコードで型の名前を間違って入力したか、型の定義を含めるのを忘れた可能性がstruct my_structありsizeofますstruct my_struct

(可能性は非常に低いですが、とにかく...)

于 2010-03-09T19:35:19.113 に答える
1

dastructおそらく配列を作成したいと思うでしょう。

   struct my_struct dastruct[10];

編集:あなたも与えcmpていないので、そこに何か問題があるかどうかはわかりません(セグメンテーション違反が発生する場所だと思います)。

于 2010-03-09T19:13:48.707 に答える
0

私が確認できる唯一のことは、あなたが を忘れていたこと#include <stdlib.h>です。Cqsortは最初の使用時に a を暗黙的に宣言することに注意してください。

于 2010-03-09T19:13:28.777 に答える
0

投稿されたコードが完全なコードである場合、のaポインターメンバーの初期化に失敗したdastructため、無効な場所を指しています。おそらくそのポインターを使用するqsort()呼び出しcmp()(そのコードは示していません) では、segfault が発生する可能性があります。

セグメンテーション違反は、2 つの定数を分割するだけの初期化以外の場所で発生すると想定していることに注意してくださいlen(コンパイル時に発生する可能性があります)。

于 2010-03-09T19:15:14.730 に答える