如何清除C中的lint警告?

时间:2014-03-21 17:22:30

标签: c loops struct lint

我在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的结构,有没有办法解决它?

3 个答案:

答案 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结构