1

我有这个函数,bits_show,它打印到标准输出一个 2-3 位长的代码。

void bits_show(bits *a)
{
  int i;
  for (i = 0; i < a->next; i++)
    putchar(a->bits[i]);
}

其中位:

struct bits {
  int capacity;
  int next;
  char *bits;
};

我正在尝试编写一个函数 char* bits_char(bits a) 来捕获这些字符并将它们收集到单个 char文件中。

这是我到目前为止所拥有的,但它不断吐出错误:

char* bits_char(bits *a)
{
  char* str = (char*) malloc( sizeof(a->next * char));
  int i;
  for (i=0; i<a->next; i++){
    str[i] = (a->bits[i]);
  }
  return str;
}

“bits.c:在函数‘bits_char’中:

bits.c:33:错误:可变大小的对象可能未初始化

bits.c:37:警告:函数返回局部变量的地址”

4

1 回答 1

2

这是错误的:

sizeof(a->next * char)

我想你打算写:

a->next * sizeof(char)

但是,由于sizeof(char)根据定义等于 1,您只需将其省略即可。

但即使这样也是错误的,因为您需要为代码当前未编写的空终止符留出空间。分配需要:

malloc(a->next+1)

并像这样添加空终止符:

str[a->next] = 0;

总而言之,成品是这样的:

char* bits_char(bits *a)
{
  char* str = malloc(a->next+1);
  int i;
  for (i=0; i<a->next; i++){
    str[i] = (a->bits[i]);
  }
  str[a->next] = 0;
  return str;
}

malloc我删除了C 中不需要的返回值的强制转换。

您还应该确保检查malloc分配失败的返回值。如果失败,它将返回空指针。我没有展示如何做到这一点,因为我不知道您的错误处理策略。

于 2013-03-13T22:16:10.377 回答