【问题标题】:Initializing an infinite number of char **初始化无限数量的 char **
【发布时间】:2013-04-12 12:54:09
【问题描述】:

我正在使用 minilibX 库在 C 中制作光线追踪引擎。 我希望能够在 .conf 文件中读取要显示的场景配置:

例如:

(Az@Az 117)cat universe.conf
#randomcomment
obj:eye:x:y:z
light:sun:100
light:moon:test

对象的数量可以在 1 和无限之间变化。 从现在开始,我正在读取文件,在 char **tab 中逐一复制每一行,并按找到的对象数进行分配,如下所示:

void    open_file(int fd, struct s_img *m)
{
  int   i;
  char  *s;
  int   curs_obj;
  int   curs_light;

  i = 0;
  curs_light = 0;
  curs_obj = 0;
  while (s = get_next_line(fd))
    {
      i = i + 1;
      if (s[0] == 'l')
        {
          m->lights[curs_light] = s;
          curs_light = curs_light + 1;
         }
       else if (s[0] == 'o')
         {
           m->objs[curs_obj] = s;
           curs_obj = curs_obj + 1;
         }
       else if (s[0] != '#')
         {
          show_error(i, s);
          stop_parsing(m);
         }
  }  

现在,我希望能够将每个tab[i] 的每个信息存储在一个新的char **tab 中,每个对象1 个,使用':' 作为分隔符。 所以我需要初始化和malloc一个未确定数量的char **tab。我该怎么做?

(Ps: 我希望我的代码和我的英语足够让你理解。而且我只使用了非常基本的功能,比如读、写、打开、malloc……我正在重新构建其他所有内容,例如 printf、get_line 等)

【问题讨论】:

  • 根据需要分配新空间有什么问题?
  • 我需要为每个新对象分配一个新的 char **tab。那么,我该怎么做呢?有没有办法根据需要声明尽可能多的 char **tab?

标签: c char malloc


【解决方案1】:

您不能分配 不确定 数量的内存; malloc 不支持。您可以做的是分配足够的内存现在并稍后修改:

size_t buffer = 10;
char **tab = malloc(buffer);

//...
if (indexOfObjectToCreate > buffer) {
  buffer *= 2;
  tab = realloc(tab, buffer);
}

【讨论】:

  • 对于任何不会意识到这一点的人:您还必须注意整数溢出。缓冲区有一个最大大小,如果你真的在读取“无限”量的数据,你最终会用完(认为这在 64 位系统上不如更小的系统重要)。
【解决方案2】:

我会使用另一种方法(因为这是 c,而不是 c++)并在我们经过时简单地分配大缓冲区:

char *my_malloc(size_t n) {
      static size_t space_left = 0;
      static char *base = NULL;
      if (base==NULL || space_left < n) base=malloc(space_left=BIG_N);
      base +=n; return base-n;
}

免责声明:我省略了垃圾收集和测试返回值以及所有安全措施以保持例程简短。

另一种思考方式是将文件读入一个足够大的未分配数组(您可以使用 ftell 检查它),扫描缓冲区,用 ascii 零字符替换分隔符、换行符等,并记住关键字。

【讨论】:

  • Ftell 选项似乎很好,所以...我要重新编码 ftell,然后尝试使用这个。谢谢!
  • 你显然知道它是fseek(fp,0,SEEK_END); sz=ftell(fp); 并且它是不可移植的。
猜你喜欢
  • 2019-06-24
  • 2018-05-11
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
相关资源
最近更新 更多