【问题标题】:How to malloc an array inside a struct如何在结构中分配数组
【发布时间】:2015-12-07 04:32:43
【问题描述】:

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

然后我创建一个筛子,然后需要将该筛子复制到 structs 数组中。我可以使用堆栈上的较小数组来执行此操作(不完整):

struct ThreadParams ptharg[THNUMS];

memcpy(ptharg[i].structprimes, primes, sizeof(int)*LIMIT);

pthread_create(&tid, NULL, Work, (void*)&ptharg[i])

希望这有意义吗?如果可能的话,我想要做的是使用 malloc 在结构内创建一个数组?

编辑和解决方案:我最终做的是像这样制作结构:

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);
}

【问题讨论】:

  • 我认为你只想要一个静态数组,而不是动态内存分配。
  • @JonathonReinhart 你是什么意思?就像不使用 malloc 只是像 int structprimes[LIMIT]; 一样正常创建数组?
  • int * structprimes = new int[LIMIT]; 应该可以帮助您。我怀疑你是否需要使用那个 malloc
  • @nullpointer 这是一个 C 问题而不是 C++。
  • 好的。著名的。 malloc 请求

标签: c arrays struct


【解决方案1】:

在 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 之外的任何函数中,则它不能作为数据参数传递给子线程,因为它是一个自动变量,在该函数退出时超出范围。

【讨论】:

  • 这帮助我解决了我的问题!但我想知道你是否可以帮助我更好地理解它。当您说声明中不可能有语句时,您的意思是什么?另外我这样做的方式是将我的结构更改为具有 int *structprimes;然后我使用你展示的for循环来分配内存并将其分配给结构指针?我理解正确吗?
  • 在第二个使用 int structprimes[LIMIT]; 的示例中,这是我最初使用的,但它会导致分段错误,因为 LIMIT 需要设置为 1,000,000+ 的值。
  • 我已将答案修改为“结构定义”,而不仅仅是“声明”。这意味着您只能在结构定义中拥有字段类型和字段名称。您不能有任何其他类型的语句,包括函数调用。是的,您描述的更改听起来不错。最后,如果您在堆栈上声明 ptharg 并且它非常大,那么是的,您确实需要使用动态内存。但请仔细注意答案中的最后一段。您可能需要动态分配整个ptharg 数组。
猜你喜欢
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多