我在C中有以下代码:
两个sturct:
typedef struct
{
int age;
int phone;
} Student;
typedef struct
{
int classNum;
Student student[1];
} ClassRoom;
然后我为10名学生创造了记忆:
ClassRoom * classRoom = (ClassRoom*)malloc(sizeof(ClassRoom) + sizeof(Student) * 9);
然后我尝试遍历所有学生:
int i = 0;
for(i = 0; i < 10; i++)
{
classRoom->student[i].age = 20;
classRoom->student[i].phone = 20;
}
然后我得到了一个lint警告:
Warning 662: Possible creation of out-of-bounds pointerby operator '[
看起来它说这两行有lint警告:
classRoom->student[i].age = 20;
classRoom->student[i].phone = 20;
问题是什么以及如何解决?我无法更改ClassRoom
的结构,有没有办法解决它?
答案 0 :(得分:0)
您正在for
循环中访问未分配的内存。
你可以这样做
int i = 0;
for(i = 0; i < 10; i++)
{
classRoom[i].student[1].age = 20;
classRoom[i].student[1].phone = 20;
}
答案 1 :(得分:0)
for(i = 0; i < 10; i++)
{
classRoom->student[i].age = 20;
classRoom->student[i].phone = 20;
}
这里你使用了10个对象,但你只为9个对象提供了内存。这是值得注意的一件事。
ClassRoom * classRoom = (ClassRoom*)malloc(sizeof(ClassRoom) + sizeof(Student) * 9);
这只为9名学生提供了记忆,因此将其更改为
ClassRoom * classRoom = (ClassRoom*)malloc(sizeof(ClassRoom) + sizeof(Student) * 10);
如果你可以改变结构然后可以使用, 对于可变数量的学生疯狂
typedef struct
{
int classNum;
Student *student;
} ClassRoom;
然后根据学生数量动态分配学生[]。将学生视为具有动态分配的内存的数组
答案 2 :(得分:0)
好吧,您正尝试使用Student[i]
取消引用未分配的内存,因为structure Classroom
内部只有1 Student
个元素。您应该只分配足够的内存来保留5 Classroom struct
,然后使用Classroom
Classroom[i]->Student
结构