繁体   English   中英

结构中一个字段的值无意间变成了另一个字段的值

[英]Value of one field in a struct becomes value of another field unintentionally

我正在尝试创建一个结构,该结构将携带餐厅订单的数据进行送货上门。

这是我的名为order.h头文件:

#ifndef ORDER_H
#define ORDER_H


extern long orderNumber;


typedef struct {

    long orderNumber;
    char *customerName;
    long customerContactNumber;
} *Order;



Order newOrder();
void setCustomerName(Order, char *);
void setCustomerContactNumber(Order, long);


#endif  

从头文件实现方法的源文件位于名为order.c下面:

#include <stdlib.h>
#include "order.h"


long orderNumber = 0;


Order newOrder() {


    orderNumber++;

    Order order = (Order)malloc(sizeof(Order));
    order->orderNumber = orderNumber;

    return order;
}



void setCustomerName(Order order, char *customerName) {

    order->customerName = customerName;
}



void setCustomerContactNumber(Order order, long customerContactNumber) {

    order->customerContactNumber = customerContactNumber;
}  

我的文件包含main方法是main.c

#include "order.h"
#include <stdio.h>



int main() {

    void displayOrder(Order);
    Order order1 = newOrder();
    Order order2 = newOrder();
    Order order3 = newOrder();

    setCustomerName(order1, "Aditya R.Singh");
    setCustomerContactNumber(order1, 123L);

    setCustomerName(order2, "Rameshwarpratap R.Singh");
    setCustomerContactNumber(order2, 456L);

    setCustomerName(order3, "Sarita R.Singh");
    setCustomerContactNumber(order3, 789L);

    displayOrder(order1);
    displayOrder(order2);
    displayOrder(order3);

    return 0;
}  




void displayOrder(Order order) {

    long id = order->orderNumber;
    char *name = order->customerName;
    long contactNumber = order->customerContactNumber;

    fprintf(stdout, "==========================================\n");
    fprintf(stdout, "Order number: %ld\n", id);
    fprintf(stdout, "Customer Name: %s\n", name);
    fprintf(stdout, "Customer Contact Number: %ld\n", contactNumber);
    fprintf(stdout, "==========================================\n");
    fprintf(stdout, "\n\n\n");

    fflush(stdout);
}  

预期的输出是:

==========================================
Order number: 1
Customer Name: Aditya R.Singh
Customer Contact Number: 123
==========================================



==========================================
Order number: 2
Customer Name: Rameshwarpratap R.Singh
Customer Contact Number: 456
==========================================



==========================================
Order number: 3
Customer Name: Sarita R.Singh
Customer Contact Number: 789
==========================================  

但是实际输出是:

==========================================
Order number: 1
Customer Name: Aditya R.Singh
Customer Contact Number: 123
==========================================



==========================================
Order number: 123
Customer Name: Rameshwarpratap R.Singh
Customer Contact Number: 456
==========================================



==========================================
Order number: 456
Customer Name: Sarita R.Singh
Customer Contact Number: 789
==========================================  

正如你可以看到, orderNumberorder2被覆盖customerContactNumberorder1

orderNumberorder3被覆盖customerContactNumberorder2

为什么会这样呢?
我应该如何获得预期的输出?

有什么帮助吗? 提前致谢。

问题在这里:

Order order = (Order)malloc(sizeof(Order));

您已将Order定义为

typedef struct {
  long orderNumber;
  char *customerName;
  long customerContactNumber;
} *Order;

这是一种指针类型,并且先前的分配为一个指针分配了空间。 正确的分配应类似于:

    Order order = (Order)malloc(sizeof(*order));

您分配内存的行是错误的。

Order order = (Order)malloc(sizeof(Order));

sizeof(order)是指针的大小,而不是struct的大小。 之后的所有内容都会受到不确定的行为的影响。

要解决此问题,可以使用:

Order order = (Order)malloc(sizeof(*order));

这样的问题可以通过使用更好的typedef来避免。 代替

typedef struct {
  long orderNumber;
  char *customerName;
  long customerContactNumber;
} *Order;

最好使用:

typedef struct {
  long orderNumber;
  char *customerName;
  long customerContactNumber;
} Order;

typedef Order* OrderPtr;

这些将减少变量类型的混淆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM