我正在努力解决一个相对微不足道的问题。
在我的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字节的区域?
这样可以吗?
1条答案
按热度按时间xxls0lw81#
你的
orders
字段是一个1000指针的数组,这些指针不会自动初始化。取决于你如何分配你的“交易者”,它要么都是NULL指针,要么是随机垃圾。strcpy()
函数期望它的第一个参数指向它可以写入的已分配内存。要解决这个问题,您需要在调用
strcpy
之前malloc()
traders[i].order[traders[i].number_of_orders]
。如果你想避免分配,那么你可以使用一个helper结构,例如
然后做
这样就得到了一个由1000个
order_data
元素组成的固定数组,每个元素包含一个固定长度的字符串。