c-main()中的结构定义导致Segmentation Fault



是否无法在main()中定义结构。我尝试了以下操作,结果出现了分段故障:

#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#define TRUE 1

void main(int argc,char **argv)
{
struct test_struct
{
        char test_name[50];
        char summary_desc[200];
        char result[50];
};
struct suite_struct
{
        char suite_name[50];
        struct test_struct test[500];
        int test_count;
        int passed;
        int failed;
        int unresolved;
        int notrun;
}suite[500];
        int a,b;
        for (a=0;a<500;a++)
        {
                strcpy(suite[a].suite_name,"");
                for (b=0;b<500;b++)
                {
                        strcpy(suite[a].test[b].test_name,"");
                        strcpy(suite[a].test[b].summary_desc,"");
                        strcpy(suite[a].test[b].result,"");
                }
                suite[a].test_count=0;
                suite[a].passed=0;
                suite[a].failed=0;
                suite[a].unresolved=0;
                suite[a].notrun=0;
        }
}

但当我把结构定义放在它工作之外的时候:

#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#define TRUE 1

struct test_struct 
{ 
        char test_name[50]; 
        char summary_desc[200]; 
        char result[50]; 
}; 
struct suite_struct 
{ 
        char suite_name[50]; 
        struct test_struct test[500]; 
        int test_count; 
        int passed; 
        int failed; 
        int unresolved; 
        int notrun; 
}suite[500]; 
void main(int argc,char **argv)
{
        int a,b;
        for (a=0;a<500;a++)
        {
                strcpy(suite[a].suite_name,"");
                for (b=0;b<500;b++)
                {
                        strcpy(suite[a].test[b].test_name,"");
                        strcpy(suite[a].test[b].summary_desc,"");
                        strcpy(suite[a].test[b].result,"");
                }
                suite[a].test_count=0;
                suite[a].passed=0;
                suite[a].failed=0;
                suite[a].unresolved=0;
                suite[a].notrun=0;
        }
}

不确定为什么会发生这种情况。我使用的是Solaris SunStudio编译器。

在第一个示例中,suite位于堆栈上,在第二个示例中它位于数据段上。

由于suite相当大(~75MB),所以segfault几乎可以肯定是由于程序的堆栈空间不足。

在大多数情况下,最好在堆上分配大型数据结构(使用malloc()等人)。这也将使您可以只分配所需的空间量,而不是总是为500个元素分配空间。

在main中声明一个结构是可以的。但在您的程序中,问题与您在主函数中创建500个该结构的对象有关。每个对象的大小约为15KB。因此,500个对象需要大约75MB。尝试printf("size: %lun", sizeof suite);

默认情况下,您没有那么多可用的堆栈。可以使用命令ulimit -s查找可用堆栈。它以KB为单位打印可用堆栈。

可以使用ulimit命令来增加堆栈。例如CCD_ 7。

更好的方法是使用malloc()动态分配所需的内存。

在任何函数(包括main)中定义struct并声明该struct的局部变量都是合法的。

但是,代码在语法上可能是合法的,并在运行时崩溃(例如,根据C标准,因为它有未定义的行为,或者因为它达到了一些系统限制,比如调用堆栈的限制)。

您在main外部定义的结构是全局的且未初始化,因此它将进入.bss段,并在执行开始时初始化为0。您在main中定义的结构非常巨大,超过了最大堆栈大小(在Linux上大约为1-2MB,在Solaris上也可能如此)。由于main之外的一个不在堆栈上,所以在这种情况下它似乎可以工作,而不是另一个。

除了关于堆栈空间、malloc和未定义行为的答案。

当我试图编译你的代码时,我得到了3个警告。

test.c:7:6: warning: return type of ‘main’ is not ‘int’
test.c: In function ‘main’:
test.c:32:17: warning: implicit declaration of function ‘strcpy’
test.c:32:17: warning: incompatible implicit declaration of built-in function ‘strcpy’

为main返回int,而不是void。

int main(int argc,char **argv)

在C中,strcpy的头是string.h,而不是string.h。

相关内容

  • 没有找到相关文章

最新更新