将其中一个字段是另一个数组的结构数组传递给函数

问题描述 投票:0回答:1

这是我的结构。

    typedef struct {
        uint8_t *data;
        size_t size;
    } buffer;

我在我的主函数中像这样初始化它。

buffer *array;
array = calloc(255, sizeof(*array));
//check for error
for (int i = 0; i < 255; i++) {
    array[i].data = malloc(sizeof(*array->data));
    //check for error
}

然后我将其传递给一个函数。

ArrayFunction(&array);

这就是它的定义方式

void ArrayFunction(buffer **array) {
    // Doing something to determine somesize
    for (int i = 0; i < 255; i++) {
        array[i]->size = 100;
        array[i]->data = calloc(100, sizeof(uint8_t));
        //check for error
        //Setting the data to something useful
    }
}

当通过调试器查看我的程序时,我在主函数中的初始化似乎很好,内存是有效的。一旦进入 ArrayFunction,第 0 个元素之后的内存就无效或未初始化,这会在尝试调用时导致分段错误。它确实适用于第 0 个步骤,设置数据步骤也适用。

arrays c memory memory-management malloc
1个回答
0
投票

你太努力了。你不需要双指针。

//**

开头的评论中的解释

您可能只想要这个:

#include <stdint.h>
#include <stdlib.h>

typedef struct {
  uint8_t* data;
  size_t size;
} buffer;

void ArrayFunction(buffer *arr) {  //** just pass the buffer (t's a pointer)
  const int somesize = 11;         //** just made up some value

  for (int i = 0; i < 255; i++) {
    arr[i].size = somesize;        //** it's arr not buffer, buffer is a type.
    arr[i].data = calloc(somesize, sizeof(uint8_t));
        
  }
}

int main(int argc, char* argv[])
{
  buffer* array;
  array = calloc(255, sizeof(*array));
  //check for error
  for (int i = 0; i < 255; i++) {
    array[i].data = malloc(sizeof(*array->data));
    //check for error
  }

  ArrayFunction(array);             //** just pass the pointer
}
© www.soinside.com 2019 - 2024. All rights reserved.