有时候我有
typedef struct _student
{
// some data
} STUDENT;
现在
main()
{
int noOfStudent;
STUDENT *b;
//some work
noOfstudent = this_much_student();
STUDENT a[noOfStudent]; // way 1
b=(STUDENT*)malloc(sizeof(STUDENT)*noOfStudent); // way 2
}
在某处我读到函数开头的所有变量都应该是defined
,并且函数中间的变量的定义应该被忽略,所以在这种情况下
way1好吗?还是way2好?为什么?(证明)
修改: 我编码目标c89编译器,我希望范围仅限于此功能
答案 0 :(得分:2)
第一种方式:
STUDENT a[noOfStudent];
定义可变长度数组。这是一个仅限C99的功能。 * 数组存在于堆栈中,一旦超出范围(例如,当函数结束时),它将自动清除。一个缺点是如果你需要一个非常大的数组,你可能会导致堆栈溢出。
第二种方式:
b=(STUDENT*)malloc(sizeof(STUDENT)*noOfStudent);
应该改写为:
b=malloc(sizeof(*b)*noOfStudent);
无论哪种方式,它都会在堆上动态创建内存。这样可以避免堆栈溢出的可能性,但它确实需要您在完成内存后明确free()
。
<小时/> *但是,许多C或C ++编译器会将其作为非标准扩展提供。
答案 1 :(得分:0)
这取决于编译器是否允许动态长度数组。如果没有,那么way2是唯一的选择。
如果是(C99),则可以通过变量的范围做出决定。
如果STUDENT
对象的范围仅在函数内,则way1或way2可能是一个不错的选择。如果您使用方式2,则可能需要明确释放它。
否则,如果你需要在函数范围之外的对象的范围,你必须使用方式2并在堆中分配内存。