# 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;
}我试图基于employee id交换结构,当我试图交换程序突然终止的结构时,我在compilation.But上没有错误。对于ints和其他基本类型,相同的交换很好用,但是对于帮助来说,structs.Thanks就不行了。
发布于 2013-12-25 11:36:19
在您的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]);
}
}
}在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]);
}
}
}请确保在循环的任何迭代中,都不应该没有绑定访问。
发布于 2013-12-25 11:30:21
请注意这一行,在这里使用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等。
发布于 2013-12-25 11:38:28
这条线
swap(&start[iter3+1], ...为start ( iter3==n,iter2 == 0)访问超出界限的数组iter2 == 0。
所以程序会调用未定义的行为。
https://stackoverflow.com/questions/20772250
复制相似问题