簡體   English   中英

初始化結構后,為什么結構的值損壞了?

[英]Why are the values of a struct corrupted after the struct is initialized?

我正在嘗試使用一些值初始化結構數組,但是我無法使這些值保持恆定。 我使用一個初始的for循環從字符串中檢索值,並將其分配給數組中的結構。 一旦嘗試使用另一個循環迭代該數組,某些值將不相同。

這是有問題的代碼:

    void printOrder(Order *node)
    {
         printf("Title is: %s\n",node->title);
         printf("Price is: $%f\n",node->price);
         printf("ID is: %d\n",node->custID);
         printf("Category is: %s\n",node->category);
    }

    void initOrder(Order *newOrder, char *title, double price, int custID, char   *category)
    {
         newOrder->title = title;
         newOrder->price = price;
         newOrder->custID = custID;
         newOrder->category = category;
         newOrder->next = NULL;

         printf("new order object initialized\n");
    }

    char *title;
    char *priceTemp;
    char *idTemp;
    char *category;

    Order localOrders[numOrders]; // numOrders is a value found earlier

    int k;
    for(k = 0; k < numOrders; k++)
    {

            fgets(Line,orderLineSize,orders); // orderLineSize was found earlier


            title = strtok(Line,"|");
            priceTemp = strtok(NULL,"|");
            idTemp = strtok(NULL,"|");
            category = strtok(NULL,"|");

            price = atof(priceTemp);
            id = atoi(idTemp);

            localOrders[k].title = title;
            localOrders[k].price = price;
            localOrders[k].custID = id;
            localOrders[k].category = category;

            Order *temp = &localOrders[k];

            initOrder(temp,title,price,id,category);
            printOrder(temp);
    }
    Order *temp;

    for(k = 0; k < numOrders; k++)
    {
            temp = &localOrders[k];
            printOrder(temp);
            printf("\n");
    }

這是Order的頭文件:

#ifndef ORDER_H
#define ORDER_H
#include <stdlib.h>
struct Order {
    char *title;
    double price;
    int custID;
    char *category;

    struct Order *next;
};

typedef struct Order Order;

void initOrder(Order *newOrder, char *title, double price, int custID, char *category);
void printOrder(Order *node);

#endif

例如,第一個循環將打印:

Title is: "Tasting Beer: An Insider's Guide to the World's Greatest Drink"
Price is: $11.310000
ID is: 5
Category is: HOUSING01

第二個循環會給我什么:

Title is: "Tasting Beer: An Insider's Guide to the World's Greatest Drink"
Price is: $19.800000
ID is: 2
Category is: s Guide to the World's Greatest Drink"

為什么在第一個循環中初始化結構的值在第二個循環中被覆蓋? 標題似乎並沒有受到影響,但是其余參數一直被覆蓋,我不確定為什么。

strtok()將指針返回到字符緩沖區Line ,該緩沖區稍后在下次調用fgets()時被覆蓋。

要保存標記化字符串的“組件”,例如,可以使用strdup()復制字符串:

title = strdup(strtok(Line,"|"));
// ...

您需要為每個數據元素分配內存。 您正在做的事情是為字符串使用相同的存儲區,只記住指向這些區域的指針,而不是為每個字符串使用新的存儲區。

因此,您需要為讀入的每個記錄malloc()一個新的存儲區,以便每個記錄都有其自己的唯一存儲區,而不是所有共享相同存儲區的記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM