减少分配给阵列的内存

时间:2014-04-30 20:27:50

标签: c arrays

假设我有一个包含句子的char数组,我希望将该句子复制到不同的数组中,但过滤某个字符:

char a[] = "hello everybody";
char b[sizeof(a)];
char idontwantyou = 'e';
int it = 0;
for (int i=0; i<sizeof(a); ++i)
    if (a[i]!=idontwantyou)
        b[it++] = a[i];

我必须为b分配相同数量的内存而不是a的大小,因为我不知道没有不需要的字符的句子大小吗?

现在,我的b数组的句子为hllo vrybody'@·&amp;¡我的意思是,阵列末尾有“垃圾”。

我有什么方法可以“剪掉”尾巴中的垃圾,因此b的大小与it的大小相同吗?

我刚刚将b复制到我定义为char c[sizeof(b)]的新数组中,但这似乎不是一个好习惯。

realloc中的b可能会做我想做的事情吗?

3 个答案:

答案 0 :(得分:1)

就地消除不需要的字符,并分配数组大小减少:

char *a = strdup("hello everybody");
char idontwantyou = 'e';
char *b = a;
char *c = a;

消除不需要的角色:

while(*b)
   {
   if(*b != idontwantyou)
      {
      *c=*b;
      ++c;
      }   

   ++b;
   }

*c='\0';

减小分配数组的大小:

b=realloc(a, strlen(a) + 1);
if(NULL == b)
   /*Handle error... */;
a=b;

测试结果:

printf("array = \"%s\"\n", a);    

输出应为:

array = "hllo vrybody"

答案 1 :(得分:0)

sizeof(b)等于sizeof(a),因为这是b的实际大小。要使用realloc,您必须首先使用malloc分配b

这将以类似于此的方式完成:

char a[] = "hello everybody";
/* better use strlen here -- it will also work with char*, and not only with
   statically allocated arrays */
char *b = malloc(strlen(a)+1);

/* your code here */

char *tmp = realloc(b, it);
if (!tmp) {
    free(b);
    /* some error here! */
} else {
    b = tmp;
    /* continue working with b */
}

这里有一些重要的内容:

  • 完成后你必须手动free b,因为它是在堆而不是堆栈上分配的,因此你必须自己释放内存而不是它会在功能出口自动释放。

  • realloc的返回值可能为NULL。在这种情况下,仍然会分配旧内存,您必须进行某种错误处理(如if所示)。

  • 如果realloc成功,tmp指向新的记忆区域且b无效,这就是我们使用b覆盖tmp的原因。

答案 2 :(得分:0)

另一种方法是在字符串上运行两次,一次计数,一次复制。

您应该根据此操作的重要程度来评估问题 程序的总体成本和CPU +内存配置文件。最有可能的是,它根本不重要。 在这种情况下,最简单的可能是最好的。