交换结构

时间:2013-12-25 11:26:25

标签: c

# 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交换结构,我在编译时没有错误。但是当我尝试交换结构时,程序突然终止。同样的交换适用于整数和其他基本类型,但不适用于结构。谢谢你的帮助。

3 个答案:

答案 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=2b.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。当iter3n-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==niter2 == 0)的范围。

因此程序会调用未定义的行为。