【问题标题】:return dynamic array of struct from function [closed]从函数返回结构的动态数组[关闭]
【发布时间】:2015-08-14 01:58:35
【问题描述】:

如何在 C 中的函数中动态创建结构数组?

结构:

typedef struct Track {
    char artist[LONGSTR];
    char file[LONGSTR];
    int id;
    int isAlbum;
    char name[LONGSTR];
    int pos;
    char title[LONGSTR];
    int time;
} Track;

功能:

int
processplaylist (struct Track** tracks, char* resp)
{
  //count the tracks to return
  //allocate space for the resulting tracks

  *tracks = mem_alloc (count * sizeof (struct Track));

  //process each track
  return count;
}

及用法:

char playliststr[] = "file: some-mp3\nTitle: Dire Straits - Romeo And Juliet\nName: TheRadio\nPos: 0\nId: 12\nOK\n"
struct Track* tracks = NULL;
int count = mpd_processplaylist(&tracks, playliststr);

在函数中,轨道得到了很好的处理,直到返回语句轨道指向正确的位置才能到达轨道。我见过的大多数问题都是关于数组到值的,而不是结构。 This answer返回一个structs数组,但是我想返回count(风格问题),通过参数返回数组。

出了什么问题?函数返回后,count有正确的值,tracks仍然为NULL。

【问题讨论】:

  • 听起来是一件功课。是否提供了mem_alloc 功能?
  • processplaylist 意味着随时处理resp,因此如果不够长,您的Track 数组需要将其大小加倍。鉴于提供的mem_alloc 函数,您到底想知道什么?
  • 不是作业,已经有一段时间了。 mem_alloc() 是一个计数内存分配函数,不比 malloc() 多多少;内存集();内存计数++;
  • 假设mem_allocmalloc 一样工作,我的代码看起来没问题。你有问题吗?
  • 从表面上看,您显示的代码应该可以工作。由于您断言它不起作用,因此有空间认为问题出在您未显示的代码中。请创建一个演示问题的 MCVE (How to create a Minimal, Complete, and Verifiable Example?)。它不需要找到实际的播放列表;它只需要放置一些数据并展示您遇到的问题。

标签: c pointers struct


【解决方案1】:

正如不那么友善的人通过否决这个问题所指出的那样,这个问题过于宽泛和模糊。我为此道歉,我很绝望。

正如 cmets 中的好人所证实的那样,代码是正确的。尽管调试器显示在 return 语句之前一切正常,但在返回使用后却不是。

通过注释掉代码行和大量记录,有两点需要注意。 在函数中,您必须将各个轨道称为(*tracks + i) 或例如(*(*tracks + i)).file。确实,示例代码中没有显示。我曾尝试过*(tracks + i)&tracks[i]tracks + i,它们在调试器中似乎都可以正常工作并且不会导致立即 错误。我猜代码弄乱了返回后才出来的内存。

在函数之外,在用法中,您将轨道称为数组,如tracks[i] 或例如tracks[i].file

我希望至少我的回答会有所帮助。

【讨论】:

  • 你确定(*tracks + i).file 吗? tracks 作为struct Track**,您将尝试在struct Track* 上应用.。无论如何,这看起来像是指向数组的指针的运算符优先级问题,您需要编写 (*arr)[i] 而不是 *arr[i]
  • @Quentin 感谢您指出这一点。调试时显示正确,但实际上并非如此。
猜你喜欢
  • 2017-04-23
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多