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

行,它可能是由sizeof(struct my_struct)评估为 0 引起的。(即问题实际上是除以零)。当类型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()可能使用该指针(您没有显示该代码)时,您可能会遇到段错误。

请注意,我假设您的段错误发生在某个地方,而不是初始化len仅划分两个常量(无论如何这很可能发生在编译时)。

于 2010-03-09T19:15:14.730 回答