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

h5qlskok  于 2023-05-16  发布在  其他
关注(0)|答案(1)|浏览(113)

我正在努力解决一个相对微不足道的问题。
在我的C程序中,我定义了一个
结构交易者

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

我有一个叫做交易者的交易者结构列表

struct trader traders[50];

我从管道中读取一些内容并将其存储在my read_input数组中
我有一个for循环,它遍历大小为50的trader数组,读取管道的值,将其存储在数组中。
我希望将这个数组转移到我的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.

下面的代码给出了这个错误

编辑

我修改了main方法中的代码
我在做这个

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

迭代我的交易者列表,并设置每个订单指针指向50字节的区域?
这样可以吗?

xxls0lw8

xxls0lw81#

你的orders字段是一个1000指针的数组,这些指针不会自动初始化。取决于你如何分配你的“交易者”,它要么都是NULL指针,要么是随机垃圾。
strcpy()函数期望它的第一个参数指向它可以写入的已分配内存。
要解决这个问题,您需要在调用strcpy之前malloc()traders[i].order[traders[i].number_of_orders]
如果你想避免分配,那么你可以使用一个helper结构,例如

struct order_data {
   char text[128];
};

然后做

order_data order[1000];

这样就得到了一个由1000个order_data元素组成的固定数组,每个元素包含一个固定长度的字符串。

相关问题