【发布时间】:2017-01-20 13:09:19
【问题描述】:
我正在用 C 语言开发用于通信的驱动程序,并且交换的消息没有固定大小。通信总线的推荐是多主题使用structs,我也是这样。
我的第一个问题:我必须继续收听新消息,当我收到一条消息时,我必须处理消息数据(它有延迟)并仍在收听新消息。
第一种解决方案:收到新消息时使用线程处理数据。
我的第二个问题:消息中的数据可以有一个结构的多个数据,而我的通信器需要使用一个结构来组织这些多个值。
第二个解决方案:使用struct hack分配struct的内存动态大小。
我当前的问题:当我将结构作为参数传递给线程或任何函数时,我会丢失数据结构并得到错误的值。
一个简短的测试是:
typedef struct test{
int size;
int value[];
} test;
void allocation(test *v){
test *aux = (test *)malloc(sizeof(test)+3*sizeof(int));
int i;
aux->value[0] = 2;
aux->size = 3;
aux->value[1] = 1;
aux->value[2] = 5;
printf("Teste1 %d\n",aux->size);
for(i=0; i < aux->size; i++){
printf("%d\n", aux->value[i]);
}
*v = *aux;
}
void cleanup(test *v){
free(v);
}
int main(int argc, char *argv[]){
test v;
int i;
allocation(&v);
printf("Teste2 %d\n",v.size);
for(i=0; i < v.size; i++){
printf("%d\n", v.value[i]);
}
//cleanup(&v);
return 0;
}
在这个测试中,我在第一次打印时得到了正确的值,在第二次打印时得到了错误的值(只有 v.size 给出了正确的值)。
而且我的结构比测试中的结构要复杂一些。我的结构是这样的:
typedef struct test1{
double v1;
double v2;
} test1;
typedef struct test2{
int size;
test1 values[];
} test2;
一旦我拥有了所有需要修复的元素,你知道如何在该函数中修复我的内存结构吗?请记住,我还可以分配多个 test2 数据是可取的(不是必需的)。
【问题讨论】:
-
请注意,在结构末尾使用
[]是灵活数组成员 (FAM),C99 及更高版本完全支持。 'struct hack' 使用[1]而不是[]并且不受完全支持(尽管它通常可以工作,尤其是因为在引入 FAM 之前它是必要的,并且仍然需要保持工作代码的向后兼容性)。
标签: c struct dynamic-allocation