所以我试图声明一个大小为19,000的结构,但是当我编译它时,出现了Seg错误,内核被丢弃。我想我必须使用malloc但我不能 考虑到我没有使用指针,找出最佳的语法是什么!
Struct people{
char name[100]
char secondname[100]
}
int main(){
struct people p1[19000]
}
上面是与我的问题对应的代码
任何帮助将不胜感激
答案 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);
}