很大的结构并出现分段错误

时间:2018-10-21 21:07:43

标签: c struct malloc

所以我试图声明一个大小为19,000的结构,但是当我编译它时,出现了Seg错误,内核被丢弃。我想我必须使用malloc但我不能 考虑到我没有使用指针,找出最佳的语法是什么!

Struct people{
    char name[100]
    char secondname[100]
   }


int main(){
    struct people p1[19000]
}

上面是与我的问题对应的代码

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

您的struct阵列大约需要3.8Mb的堆栈空间,而在大多数现代台式机平台上,典型的默认进程或线程堆栈可能只有几Mb。

您可以动态或静态分配内存。如果最简单,最合适的静态分配是数组的生存期,则是程序执行的持续时间,并且所需的大小先验

int main()
{
    static struct people p1[19000] ;
}

动态分配是一种可能的解决方案,但是由于malloc()返回一个指向已分配内存的指针,因此您必须使用指针。但是可以使用数组访问符号,因此您的暴露ot指针将最小:

int main()
{
    struct people* p1 = malloc(sizeof(struct people) *19000 ) ;

    ...

    // Access to elements of the dynamically allocated array
    // is identical to that of the statically allocated array.
    printf( "%s", p1[0].name ) ;
}

动态分配的优点是您可以避免分配任意大的空间,并按需创建记录,将指针存储在动态调整大小的数组中(例如,使用realloc()),或者使用一些合适的容器数据结构作为链接列表。但这可能对于您目前所在的位置来说太先进了。

答案 1 :(得分:0)

struct people p1 [19000]试图在自动堆栈存储器中创建100 + 100字节的19000个结构。正常的堆栈内存不够大,会出现堆栈溢出或其他错误。

在C语言中,可用的堆内存更多,但是程序员必须进行堆内存管理

要在堆内存中分配数组,可以使用例如:

int main() {
   struct people *p1 = malloc(19000 * sizeof(struct people));
   // you can now access p1 using array brackets as follows:
   // strcpy(p1[0].name, "name");
   // strcpy(p1[0].secondname, "secondname");
   // printf("name: %s, secondname: %s\n", p1[0].name, p1[0].secondname);

}