将内存分配给字符串以写入更多数据

时间:2014-07-21 22:33:42

标签: c malloc

我想在现有内存中分配内存,但仍希望将存储的数据保存在该字符串中

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

main()
{
char *str1= "hello";
char *str2= "Abhimanyu";

char *str = malloc( strlen(str1) + strlen(str2) +1 );

strcpy(str,str1);
strcat(str,str2);
printf("%s",str);
return 0;
}

我想要的是我在现有str1中使用malloc分配一些而不使用str是否可能?

5 个答案:

答案 0 :(得分:1)

  

我想要的是我在现有的str1中使用malloc分配一些而不使用str是否可能?

如果您不再需要它来指向字符串文字,您当然可以将str1指向其他内存。
只需指定新值即可 重新分配的功能是realloc

您可能需要的一些事实:

  • 字符串文字可能无法更改,即使它的类型为char[],它实际上也是常量 它是静态分配的,因此与malloc等无关 所有常量文字(包括字符串文字)都可以共享存储空间。
  • 有一个POSIX函数用于复制字符串(内部分配有malloc的内存):strdup()
  • 您可以realloc在堆上分配兼容函数的内存。其中包括:malloc calloc reallocstrdup)。不要忘记free
  • 如果重新分配内存,除非重新分配失败(返回NULL),否则您可能不再使用旧指针。所有数据都从旧内存块复制到新内存块,最小为新旧长度。其余部分未初始化。

除此之外:请注意main几乎总是有int的返回类型,隐式返回类型是古老的遗产。
如果您使用合适的编译器,请求所有警告-Wall -Wextra -pedantic并选择现代标准(C99或C11)将对您有所帮助。

答案 1 :(得分:1)

我看到的唯一方法是以下

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

#define HELLO "hello"

int main( void )
{
   char *str2 = "Abhimanyu";
   char *str1 = malloc( sizeof( HELLO ) );

   strcpy( str1, HELLO );

   str1 = realloc( str1, strlen( str1 ) + strlen( str2 ) +1 );
   strcat( str1, str2 );

   printf( "%s\n", str1 );

   free( str1 );

   return 0;
}

答案 2 :(得分:0)

您可以使用realloc来增加指针指向的内存块,但是realloc实现可能会最终将数据移动到内存中的其他位置并更改指针的地址,因此您应该始终仔细检查指针。如果请求的新大小大于可用的大小,则会发生这种情况。

如果您需要能够动态调整指针所指向的内存块的大小,那么您可能需要考虑构建自己的内存分配器或缓冲池并获取管理内存的所有权。池。

答案 3 :(得分:0)

您可以使用realloc 尝试来调整之前的分配。它对任意指针(例如str1 = "hello"†)起作用 - 您需要使用例如malloc分配初始区域。它也可能最终在不同的地址分配一个新区域(并在那里复制旧区域的内容),即你必须更新引用旧区域的所有指针指向新区域由realloc返回的区域。

如果这些限制是不可接受的,那你就不走运了,需要以其他方式设计你的程序(例如,设置一个最大长度并保留那么多空间开始,然后只需使用你想要的)

†另请注意,字符串文字(例如"hello")不能随时修改。解决此问题的典型方法是使用数组,例如char str1[] = "hello",但也无法调整大小。 (但如果您知道稍后将存储更长的字符串,则可以为其初始内容指定更大的大小。)

答案 4 :(得分:0)

我相信你在问你是否可以接受这个声明:

char * str1 = "hello";

并以某种方式导致str1指向可用的额外空间。

答案是不要这样做!请注意str1是本地(堆栈)变量。它可能指向一些文字池,但它可能指向堆栈上分配更多空间。

所以这样做

char * str1 = hello;
...
str1 = realloc (str1, 100);
可能会引起dom! (一个适合OP编码风格的UNIX第六版笑话。)