将字符串从管道存储到 C 中的结构

问题描述 投票:0回答:1

我正在为一个相对微不足道的问题而苦苦挣扎。

在我的 C 程序中,我定义了一个

结构交易员

    struct trader {
    int pid;
    char *order[1000];
    int number_of_orders;
};

我有一个名为 traders 的交易者结构列表

struct trader traders[50];

我从管道中读取了一些内容并将其存储在我的 read_input 数组中

我有一个 for 循环遍历我的大小为 50 的交易者数组,读取管道的值,并将其存储在数组中。

我希望将这个数组转移到我的 traders[i].orders 变量中并将其存储在其中。

因此每个交易者都可以存储多个值,例如订单数量计算从管道中读取的值的数量

最初它是 0,因为这是第一次读取,并且每次从管道读取时它都会增加。

如果我的管道读入值“hello”,它将把它存储在我的 traders[i].order[number_of_orders] 数组的第一个位置 (0),如果它读取另一个值,它将把它存储在第二个位置traders[i].order[number_of_orders] 其中 number_of_orders = 1.

for(int i = 0; i< sizeof(traders) / sizeof(struct trader); ++i){
        if(child_pid == traders[i].pid){
            int pip_read = read(fdTrader, read_input, sizeof read_input);
            read_input[pip_read] = '\0';
            read_input[strlen(read_input)-1] = '\0';

            if(traders[i].number_of_orders < 1000){
                strcpy(traders[i].order[traders[i].number_of_orders], read_input);
                traders[i].number_of_orders++;
            }


            
            write(fdExchange, "ACCEPTED 0;", strlen("ACCEPTED 0;"));
            kill(child_pid, SIGUSR1);
            init_orderbook(i,read_input,traders[i]);
        }
    }



==60==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x7f23dd6a7166 bp 0x7ffedaee18f0 sp 0x7ffedaee18c8 T0)
==60==The signal is caused by a WRITE memory access.
==60==Hint: address points to the zero page.

下面的代码给我这个错误

编辑

我在我的主要方法中修改了我的代码

我在做这个

 for (int i = 0; i < 50; i++) {
    for (int j = 0; j < 1000; j++) {
        traders[i].order[j] = malloc(50 * sizeof(char));
    }
}

迭代我的交易员列表,并将每个订单指针设置为指向 50 字节的区域?

这样可以吗?

arrays c pipe
1个回答
0
投票

您的

orders
字段是 1000 pointers 的数组 - 这些不会自动初始化。取决于你如何分配你的“交易者”,它要么全是 NULL 指针,要么是随机垃圾。

strcpy()
函数期望它的第一个参数指向它可以写入的已分配内存。

要解决此问题,您需要先

malloc()
traders[i].order[traders[i].number_of_orders]
在调用
strcpy
之前。

如果你想避免分配,那么你可以使用一个辅助结构,例如

struct order_data {
   char text[128];
};

然后做

    order_data order[1000];

这为您提供了一个由 1000 个

order_data
元素组成的固定数组,每个元素都包含一个固定长度的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.