我想按学生姓名的第一个字母排序一组结构。我到目前为止所做的代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int cod;
char* name;
int mark;
}student;
void print(student* class){
int i;
for (i=0;i<4;i++){
printf("%d\n",class[i].cod);
printf("%s\n",class[i].name);
printf("%d\n",class[i].mark);
printf("\n");
}
}
int main(int argc, char *argv[])
{
int ind,i;
int cod=1000;
student class[4];
student temp;
int lengthData=10;
for (i=0;i<4;i++)
{
class[i].name=malloc(sizeof(char)*lengthData);
}
class[0].cod=cod;
class[0].name="Joseph";
class[0].mark=15;
cod++;
class[1].cod=cod;
class[1].name="Jonathan";
class[1].mark=16;
cod++;
class[2].cod=cod;
class[2].name="Karen";
class[2].mark=17;
cod++;
class[3].cod=cod;
class[3].name="Anna";
class[3].mark=20;
print(class);
for (ind=1;ind<4;ind++){
temp=class[ind];
i=ind-1;
while (i>=0){
if (temp.name[0]<class[i].name[0]){
class[i+1]=class[i];
class[i]=temp;
i--;
}
else break;
}
}
printf("ordered data\n");
print(class);
system("PAUSE");
return 0;
}
我正在使用DevC ++,当我运行它时程序挂起,但是当我在循环之前添加以下行以进行冒泡排序(仅用于测试):
class[3]=class[2];
printf("%s\n",class[3].name);
for (ind=1;ind<4;ind++){
...
即使一条记录(3)已被记录(2)的数据替换,该程序也能正常工作。
任何帮助?
答案 0 :(得分:2)
你有很多问题:
首先,你泄漏内存,因为你分配内存并使name
指向那个,然后你将name
指向其他地方。您需要复制到您分配的内存中。
其次,同样使用name
成员,一旦复制到内存中,您将超出范围,因为您只为每个字符串分配了五个字节,但是您的字符串最多不超过九个字符( 10与终结者)。
第三,更多关于走出界限,你的class
数组只有三个元素,但你可以访问数组的四个元素。
name
指针的重新分配不会导致比临时内存泄漏更多的问题,因为您不会尝试将指针传递给free
。第二个问题并不是真正的问题,因为你不能复制字符串。另一方面,第三个问题是,只要执行该代码,就会导致undefined behavior。