我需要将包含参数的结构传递给某些线程。其中一个参数是一个非常大的数组。我正在尝试做我之前所做的事情,我使用malloc在堆上创建数组,但我似乎无法弄清楚如何使用结构。那么我要做的是将一个不同的数组memcpy到struct数组中。
#define LIMIT 100000 //Size of seive
#define THNUMS 3 //Number of threads
struct ThreadParams
{
int id; // id
int low; // start
int high; // end
int *structprimes; // each thread's seive
structprimes = malloc(sizeof(int)*LIMIT);
};
然后我创建一个筛子然后需要将此筛子复制到结构阵列。我能够通过堆栈中的较小数组执行此操作(类似于此(不完整)):
struct ThreadParams ptharg[THNUMS];
memcpy(ptharg[i].structprimes, primes, sizeof(int)*LIMIT);
pthread_create(&tid, NULL, Work, (void*)&ptharg[i])
希望这有道理吗?我想要做的是使用malloc在struct中创建一个数组,如果可能的话呢?
编辑和解决方案:我最终做的是制作这样的结构:
struct ThreadParams
{
int id; // id
int low; // start
int high; // end
int *structprimes; // each thread's seive
};
然后在main()中使用malloc:
将内存分配给指针for (a = 0; a < THNUMS; a++)
{
ptharg[a].structprimes = malloc(sizeof(int)*LIMIT);
}
答案 0 :(得分:3)
在C中,不可能在结构定义中包含语句。相反,您需要声明变量然后初始化变量,包括任何动态内存。例如:
struct ThreadParams ptharg[THNUMS];
int ix;
for (ix = 0; ix < THNUMS; ix++) {
ptharg[ix].structprimes = malloc(sizeof(int)*LIMIT);
if (!ptharg[ix].structprimes) {
/* error handling goes here */
}
}
或者,可以在结构中静态声明数组。例如:
struct ThreadParams
{
int id; // id
int low; // start
int high; // end
int structprimes[LIMIT]; // each thread's seive
};
然而,您的方法存在第二个可能的问题。您尚未显示struct ThreadParams ptharg[THNUMS];
所在的位置。但是如果它在main
之外的任何函数内部,那么它就不能作为数据参数传递给子线程,因为当该函数退出时它将是一个超出范围的自动变量。