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

在C中对结构数组进行排序时出现问题,c,struct,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",cl

我想按学生姓名的第一个字母排列结构数组。到目前为止,我编写的代码如下:

#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;
}
#包括
#包括
类型定义结构{
国际化学需氧量;
字符*名称;
整数标记;
}学生;
作废打印(学生*班级){
int i;

对于(i=0;i您有很多问题:

首先,您泄漏内存,因为您分配内存并使
name
指向该位置,然后使
name
指向其他位置。您需要复制到您分配的内存中

其次,同样对于
name
成员,一旦复制到内存中,您就会越界,因为您只为每个字符串分配五个字节,但您的字符串至少有九个字符(十个带有终止符)

第三,关于越界,您的
数组只有三个元素,但您可以访问数组的四个元素


重新分配
名称
指针不会造成比临时内存泄漏更多的问题,因为您不会尝试将指针传递到
空闲
。第二个问题不是真正的问题,因为您尚未复制字符串。另一方面,第三个问题是,一旦执行该代码,就会导致内存泄漏

你有很多问题:

首先,您泄漏内存,因为您分配内存并使
name
指向该位置,然后使
name
指向其他位置。您需要复制到您分配的内存中

其次,同样对于
name
成员,一旦复制到内存中,您就会越界,因为您只为每个字符串分配五个字节,但您的字符串至少有九个字符(十个带有终止符)

第三,关于越界,您的
数组只有三个元素,但您可以访问数组的四个元素


重新分配
名称
指针不会造成比临时内存泄漏更多的问题,因为您不会尝试将指针传递到
空闲
。第二个问题不是真正的问题,因为您尚未复制字符串。另一方面,第三个问题是,一旦执行该代码,就会导致内存泄漏

我已经修复了2和3,但仍然出现意外行为,有什么问题吗?谢谢,它工作了,谢谢,我会尝试修复1号我已经修复了2和3,但仍然出现意外行为,有什么问题吗?谢谢,它工作了,谢谢,我会尝试修复1号
class[3]=class[2];
printf("%s\n",class[3].name);

  for (ind=1;ind<4;ind++){
...