为指向结构数组的指针动态分配内存

时间:2013-04-25 06:58:20

标签: c memory-management structure

我有这个结构

typedef struct STUDENT
{
    char studName[20];
    int timeEnter;
    int timeUpdate;
}STUDENT;

和结构数组的本地指针

STUDENT *studArr[100];

我正在尝试通过在文件的第一行读取来为结构分配内存,然后使用它为结构分配内存。

fscanf(fp, "%s", &first);
**studArr = (STUDENT**) malloc(sizeof(STUDENT*)*first);

我得到一个错误,说没有运算符“=”匹配分配行上的这些操作数

为什么我会收到错误,我在这里做错了什么?

提前谢谢

5 个答案:

答案 0 :(得分:3)

我认为你是混乱的东西,看起来你正在声明一个指针数组,当你需要的只是一个指针。请注意,只要您正确编制索引,指向“一”struct的指针与指向一百的指针相同。

你可能应该:

STUDENT *studArr;

然后,一旦你知道你需要多少(我假设first是分配空间的学生人数):

studArr = malloc(first * sizeof *studArr);

另请注意no casting is needed

答案 1 :(得分:1)

如果您想分配100名学生的数组,您有两种选择:

struct STUDENT
{
    char studName[20];
    int timeEnter;
    int timeUpdate;
};


struct STUDENT studArr1[100];

... OR ...

struct STUDENT *studArr2 = (struct STUDENT *)malloc (sizeof (struct STUDENT) * 100);

如果你只想要一个指针,你可以说:

  struct STUDENT *p = studArr1;

PS:

我特意留下了“typedef”的东西,以免混淆基本问题(struct与struct的数组与指向struct数组的指针)。

答案 2 :(得分:0)

您已经定义了一个指向struct的指针数组,而不是指向struct数组的指针。数组的内存已作为全局数组分配。

**studArr的类型是STUDENT,因此与赋值运算符右侧的表达式不兼容,该运算符已转换为(STUDENT**)

你可能意味着:

STUDENT **studArr;

[...]

fscanf(fp, "%s", &first);
studArr = (STUDENT**) malloc(sizeof(STUDENT*)*first);

答案 3 :(得分:0)

当你使用STUDENT * studArr [100];那就意味着你为STUDENT结构类型分配了100个指针的内存。

所以为了分配内存,你应该尝试。

studArr =malloc(sizeof(struct STUDENT)*first);

然后您可以将所有已分配的成员作为studArr[i] ....so on访问。

答案 4 :(得分:0)

你并不清楚你的总体目标是什么。

首先,如果要读取整数,则需要使用%d

int count;
if (fscanf(fp, "%d", &count) != 1) { // error... }

接下来,不要将STUDENT用作struct name和typdef。只需保留结构名称:

typedef struct
{
    char studName[20];
    int timeEnter;
    int timeUpdate;
} student_t;

现在,您只想要一个指向student_t s:

数组的指针
student_t* student_array = NULL;

最后,分配该数组:

student_array = malloc(count * sizeof(student_t));

现在您可以使用它,例如:

strncpy(student_array[0].studName, "Bobby", 20);

或者获得指向个别学生的指针:

student_t* bob = &student_array[1];
bob->timeEnter = 42;