如何在结构中malloc一个数组

时间:2015-12-07 04:32:43

标签: c arrays struct

我需要将包含参数的结构传递给某些线程。其中一个参数是一个非常大的数组。我正在尝试做我之前所做的事情,我使用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);
}

1 个答案:

答案 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之外的任何函数内部,那么它就不能作为数据参数传递给子线程,因为当该函数退出时它将是一个超出范围的自动变量。