使用动态内存分配设置char数组的确切大小

亚历山德鲁·迪努(Alexandru Dinu)

我必须从stdin中读取一些字符(我不知道其中有多少字符,但不超过MAX),我想将它们存储在数组中。此代码段正确吗?

char *c1 = (char*) malloc(MAX * sizeof(char)); //may be too much
fgets(c, MAX, stdin);
int size = strlen(c1);
char *c2 = (char*) realloc(c1, size * sizeof(char));
free(c1);

或者,当您不知道要存储多少个元素时,有没有一种更优雅的方法来确定分配给数组的内存量?

萨马拉斯

在其中fgets(),您可能c1不是这样c

您可以这样做(如果您坚持使用realloc()):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 50

int main() {
  char *c1 = malloc(MAX * sizeof(char));
  if(!c1) {
    printf("malloc() failed\n");
    return -1;
  }
  fgets(c1, MAX, stdin);
  int size = strlen(c1);
  char* c2;
  if(c1[size - 1] == '\n') {
    c1[size - 1] = '\0';
    c2 = realloc(c1, (size) * sizeof(char));
  } else {
    c2 = realloc(c1, (size + 1) * sizeof(char));
  }
  if(!c2) {
    printf("realloc() failed\n");
    return -1;
  }
  c1 = NULL;
  printf("Input was: %s\n", c2);
  free(c2);
  return 0;
}

这里有一些评论:

  1. 您希望读取一个字符串,因此应使用char*而不是int*

  2. 通常,您不希望fgets()保留换行符,因此我使用c1[size - 1] = '\0';,它将覆盖它。但是,如果用户输入了允许的最大字符,则将没有空间,因此我们检查换行符是否确实存储在缓冲区中。

  3. 不要投malloc()退。

  4. 在中realloc(),您应该为字符串的大小PLUS NULL TERMINATOR分配空间这就是现在的原因size+1但是,在我们覆盖换行符的情况下,则不需要这样做,因为我们已经将字符串的大小减小了一个,因此size就足够了。

  5. 永远不要忘记取消分配您的内存。


但是,如果我是您,我会打印一条消息,警告用户输入MAX字符并避免重新分配。

您会看到,作为fgets()引用状态,该函数将:

从流中读取字符,并将它们作为C字符串存储到str中,直到已读取(num-1)个字符或到达换行符或到达文件末尾为止,以先发生的为准。

因此,即使用户输入了更多内容,该程序也不会崩溃。


正如Paul正确评论的那样,使用第二个指针是一个非常好的主意,这样,如果realloc()失败,我们将不会丢失数据。

另请注意,您不应释放c1,因为此指针无效,应将其设置为NULLc1可能会指向哪里c2,因此,如果我们释放c1c2则将指向垃圾。或者可能是整个内存块都转移到其他地方,因此c1指向垃圾,我们正在尝试释放。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

对于C ++动态内存分配的确切含义有些困惑

来自分类Dev

char的动态内存分配**

来自分类Dev

为char数组分配动态内存

来自分类Dev

char *保留整数的动态内存分配

来自分类Dev

char *保留整数的动态内存分配

来自分类Dev

指针数组的动态内存分配

来自分类Dev

数组C的动态内存分配

来自分类Dev

结构数组的动态内存分配

来自分类Dev

指针数组的动态内存分配

来自分类Dev

结构中数组的动态内存分配

来自分类Dev

使用sbrk的MIPS动态内存分配

来自分类Dev

使用“ new”的c ++动态内存分配

来自分类Dev

流行使用动态内存分配

来自分类Dev

在动态内存分配中使用指针

来自分类Dev

使用sbrk的MIPS动态内存分配

来自分类Dev

流行使用动态内存分配

来自分类Dev

如何确定ETS表的确切内存大小?

来自分类Dev

取消分配动态内存

来自分类Dev

动态内存分配的限制

来自分类Dev

精确的动态内存分配

来自分类Dev

动态内存分配问题

来自分类Dev

动态内存分配php

来自分类Dev

(C)将数组与动态内存分配一起使用

来自分类Dev

使用动态内存分配将元素添加到数组中

来自分类Dev

使用动态内存分配在二维数组中添加值

来自分类Dev

如何设置内联SVG元素的确切大小?

来自分类Dev

如何设置内联SVG元素的确切大小?

来自分类Dev

动态内存/重新分配字符串数组

来自分类Dev

在C中的结构内的指针数组的动态内存分配