这是申报记忆的好方法吗?

时间:2011-11-30 11:14:30

标签: c

有时候我有

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编译器,我希望范围仅限于此功能

2 个答案:

答案 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并在堆中分配内存。