我可以只释放一部分字符串吗?

时间:2015-06-13 16:11:18

标签: c string free

我填写了一串字符,我不时加倍大小。

当我完成时,我想释放未使用的内存。

void fun (char **str, size_t *len) {
  size_t lsi; //last_significant_index
  //filling up the str and reallocating from time to time.
  //*len is storing the total size of allocated memory at this point

  // idea #1
  free((*str)[lsi + 1]); 

  // idea #2
  for(size_t i = lsi + 1; i < *len; i++) {
    free(&(*str)[i]);
  }
}

但这些想法似乎都不起作用

甚至可以这样做吗?如果是这样,怎么样?

详细说明:

我正在使用此功能重新分配我的字符串:

static void increase_list_size(char **list, size_t *list_len)
{
   size_t new_list_size = (*list_len + 1) * 2; // I am not allocating my list at the declaration, so *list_len initially equals 0.
   char *new_list = malloc(sizeof(char) * new_list_size);
   for (size_t i = 0; i < *list_len; i++)
   {
       new_list[i] = (*list)[i];
   }
   if (list != NULL) // I don't want to free an empty list (it wasn't allocated at the declaration!
   {
       free(*list);
   }
   (*list) = new_list;
   *list_len = new_list_size;
}

正如您所看到的,我每次都会分配两倍的内存 - 这就是为什么我想在最后释放未使用的内存。

我认为有某种棘手的方法可以做到这一点,因为我觉得你只能使用free()释放整个内存块。

4 个答案:

答案 0 :(得分:5)

不,你只能free() malloc()返回的指针。

您希望使用realloc()将分配的内存大小更改为更小(以及更大)的大小。将保留数组的内容。

示例:

#include <stdlib.h>
int main() {
    char *str = malloc(100);
    ...
    str = realloc(str, 50);
    ...
    free(str);
}

请记住检查realloc()(以及malloc()之一)的返回值,以确保(重新)分配没有失败。

答案 1 :(得分:2)

您只能free指针mallocrealloc的结果。您不能通过free与其任意偏移来减小分配的大小。但是可以将 realloc缩小到更小的尺寸:realloc(*str, lsi)

答案 2 :(得分:1)

一种方法是创建一个新字符串并仅使用所需空间并将内容复制到此字符串。现在你可以释放前一个。 我将使用这是realloc()是不允许的(有时在家庭作业中)

另一种方式是realloc(),正如其他人所建议的那样。

答案 3 :(得分:0)

您可以使用标题realloc

中声明的标准C函数<stdlib.h>

例如

char *s = malloc( 100 );
strcpy( s, "Hello world" );

char *p = realloc( s, strlen( s ) + 1 );

if ( p != NULL ) s = p;

这是一个示范程序

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

int main( void )
{
    char *s = malloc( 100 );
    strcpy( s, "Hello world" );

    char *p = realloc( s, strlen( s ) + 1 );

    if ( p != NULL ) s = p; 

    puts( s );

    free( s );

    return 0;
} 

程序输出

Hello world

或者如果你想编写一个单独的函数,那么它可以采用以下方式

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

void resize( char **s, size_t n )
{
    char *p = realloc( *s, n );

    if ( p != NULL ) *s = p;
}   

int main( void )
{
    char *s = malloc( 100 );
    strcpy( s, "Hello world" );

    resize( &s, strlen( s ) + 1 );

    puts( s );

    free( s );

    return 0;
} 

您也可以使用POSIX函数strdup