栈的动态内存分配数组

Posted

技术标签:

【中文标题】栈的动态内存分配数组【英文标题】:Dynamic memory allocation array of stack 【发布时间】:2021-10-22 19:05:09 【问题描述】:

我有以下结构

typedef struct 
    Char *name;
    int age;
    double balance;
     info_t;

还有下面的函数

 void readFile(FILE *file, info_t **arr) 

我想解析一个 cvs 文件并使用动态内存分配将每一行(每一行包含一个名称、年龄、余额)存储到结构数组中。我该怎么做?每行的缓冲区为 256,每个字段为 24。我想动态分配结构数组和结构内的元素。顺便说一句,语言是c。

【问题讨论】:

通用 CSV 文件具有欺骗性易于解析。我说“欺骗性地”是因为有很多角落或特殊情况处理起来并不简单。我建议您尝试找到一个为您加载和解析 CSV 的库。 到目前为止你尝试了什么? 如果您希望readFile 函数也分配数组,那么您需要在C 中模拟通过引用传递。你必须通过成为three star programmer来做到这一点。 对了,你为什么需要这么多的动态分配?我可以理解您可能希望通过不创建仅使用几个字符的字符串来节省空间,但为什么要指向info_t?那应该解决什么问题?它所做的只是增加了复杂性。 void readFile(FILE *file, info_t **arr)???编写代码肯定会容易得多,因此简单地 return info_t 指针 .... 【参考方案1】:

一种可能的方法:

typedef struct  char* name; int age; double balance;  info_t;

// prototype of functions that need to be implemented
char* get_next_line_of_file(FILE*);
info_t parse_single_line(const char*);

// readFile() returns the number of items stored in `result`; `result` is a pointer to an array of `info_t` items
size_t readFile(FILE* file, info_t** result) 
  // our array is initially empty
  *result = NULL;
  size_t arr_size = 0;

  // let's read the lines
  while (true) 
    char* line = get_next_line_of_file(file);
    // `line` here is dynamically-allocated, so we also check that it's not NULL
    if (line == NULL)  break; 

    // let's parse the line
    info_t parsed_line = parse_single_line(line); // here is where you malloc() space for member `name` of `info_t`
    if (parsed_line.name == NULL)  break;  // `name` allocation failed

    // now that we have a new record, we can add it to the `result` array
    info_t* new_array = realloc(*result, sizeof(info_t) * (arr_size + 1));

    // if allocation went wrong, we simply return
    if (new_array == NULL) 
      free(parsed_line.name); // we avoid memory leaks
      break;
    

    // since `new_array` is valid, we can now update `*result`
    *result = new_array;
    arr_size += 1; // we update array's size

    // the newly-added record must be equal to the newly-parsed line
    (*result)[arr_size - 1] = parsed_line;
  

  return arr_size;


// that's how you use the previous function
int main(void) 
  FILE* file = fopen(...);

  info_t* arr;
  size_t arr_size = readFile(file, &arr);

  // let's print all records
  for (size_t i = 0; i < arr_size; i += 1) 
    printf("%s, %d, %lf\n", arr[i].name, arr[i].age, arr[i].balance);
  

  return 0;

这是你想要完成的吗?

【讨论】:

我很欣赏你在这方面所做的工作(假设这是你的工作,而不是从其他地方复制/粘贴),但是没有解释的代码墙并不是很有启发性。 @RobertHarvey 这是我专门为这个问题写的一个草稿,我放了一些cmets来解释函数的各个步骤,但也许你说它不够解释? (只是问,我可能会添加更多的 cmets)。 OP 可以使用此代码作为编写通用动态分配数组生成器的方法。 P.S.:在我看来,函数的关键部分(但严格来说不是问题的一部分)是 get_next_line_of_file()parse_single_line(),这就是为什么它们的实现留给 OP。 您可以/应该为readFile 的最后三行的块/行添加注释,以解释他们在做什么。代码 well 另有注释。 IMO,代码中做得好的/放置的 cmets 有时比代码的单独描述[没有 cmets] 更好。 @CraigEstey 我已根据您的建议评论了最后几行。

以上是关于栈的动态内存分配数组的主要内容,如果未能解决你的问题,请参考以下文章

堆/栈的比较 以及 malloc/new动态内存的开辟

java中堆和栈的区别

动态内存分配

C语言之动态内存管理(动态内存分配+经典笔试题+柔性数组)[建议收藏]

malloc内存分配

二维数组动态内存分配崩溃[重复]