# include <stdio.h>
# include <stdlib.h>
typedef struct
{
int Employee_id;
char Employee_Name[50];
float Employee_salary;
} employee;
void swap(employee *a,employee *b);
int main(int argc,char* argv[])
{
int n;
int iter,iter2,iter3,iter4;
scanf("%d",&n);
employee *start = (employee *)malloc(n*sizeof(employee));
employee temp;
for (iter = 0; iter < n;iter++)
{
scanf("%d",&((*(start+iter)).Employee_id));
scanf("%s",(*(start+iter)).Employee_Name);
scanf("%f",&((*(start+iter)).Employee_salary));
}
//USING BUBBLE SORT TO SORT ON BASIS OF IDS
for (iter2 = 1; iter2 <=n; iter2++)
{
for (iter3 = 0; iter3 <n-iter2 ; iter3++)
{
if ((start[iter3]).Employee_id > (start[iter3+1]).Employee_id)
{
swap(&start[iter3+1],&start[iter3]);
}
}
}
//PRINTING
for (iter4 = 0; iter4 < n; iter4++)
{
printf("%d\n",(*(start+iter4)).Employee_id);
printf("%s\n",(*(start+iter4)).Employee_Name);
printf("%f\n",(*(start+iter4)).Employee_salary);
printf("\n");
}
free(start);
return EXIT_SUCCESS;
}
void swap(employee *a,employee *b)
{
employee temp = *a;
*a = *b;
*b = temp;
}
我正在尝试根据员工ID交换结构,我在编译时没有错误。但是当我尝试交换结构时,程序突然终止。同样的交换适用于整数和其他基本类型,但不适用于结构。谢谢你的帮助。
答案 0 :(得分:3)
注意这一行,其中n
未经初始化使用。
employee *start = malloc(n*sizeof(employee));
要解决此问题,您需要交换这两行:
employee *start = malloc(n*sizeof(employee));
scanf("%d",&n);
此外,您需要在此处添加显式类型转换,将此行更改为:
employee *start = (employee *)malloc(n*sizeof(employee));
修改:swap()
没问题。请参阅以下测试:
employee a, b;
a.Employee_id = 1;
a.Employee_Name[0] = 'a';
a.Employee_salary = 10.0;
b.Employee_id = 2;
b.Employee_Name[0] = 'b';
b.Employee_salary = 20.0;
swap(&a, &b);
在此之后,a.Employee_id=2
和b.Employee_id=1
等
答案 1 :(得分:3)
在for
循环中进行排序。
for (iter2 = 0; iter2 <n; iter2++)
{
for (iter3 = 0; iter3 <n-iter2 ; iter3++) //LINE A
{
if ((start[iter3]).Employee_id > (start[iter3+1]).Employee_id)
{
swap(&start[iter3+1],&start[iter3]);
}
}
}
在LINE A,当iter2
为0时,内循环将从0到n-1。当iter3
为n-1
时,您正在访问n
处的项目,这将导致未定义的行为(超出范围的索引)。
因此,请按如下方式更改您的代码:
for (iter2 = 0; iter2 <n; iter2++)
{
for (iter3 = 0; iter3 <n - 1 -iter2 ; iter3++)
{
if ((start[iter3]).Employee_id > (start[iter3+1]).Employee_id)
{
swap(&start[iter3+1],&start[iter3]);
}
}
}
请确保在循环的任何迭代中,都不应该有超出限制的访问权限。
答案 2 :(得分:2)
这一行
swap(&start[iter3+1], ...
访问数组start
超出iter3==n
(iter2 == 0
)的范围。
因此程序会调用未定义的行为。