在C中排序结构数组时出现问题

时间:2018-02-07 19:57:39

标签: c struct

我想按学生姓名的第一个字母排序一组结构。我到目前为止所做的代码如下:

#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)的数据替换,该程序也能正常工作。

任何帮助?

1 个答案:

答案 0 :(得分:2)

你有很多问题:

首先,你泄漏内存,因为你分配内存并使name指向那个,然后你将name指向其他地方。您需要复制到您分配的内存中。

其次,同样使用name成员,一旦复制到内存中,您将超出范围,因为您只为每个字符串分配了五个字节,但是您的字符串最多不超过九个字符( 10与终结者)。

第三,更多关于走出界限,你的class数组只有三个元素,但你可以访问数组的四个元素。

name指针的重新分配不会导致比临时内存泄漏更多的问题,因为您不会尝试将指针传递给free。第二个问题并不是真正的问题,因为你不能复制字符串。另一方面,第三个问题是,只要执行该代码,就会导致undefined behavior