C 为sprintf问题分配内存?

C 为sprintf问题分配内存?,c,C,问题是我不知道字符串的长度,所以我不知道应该为我的数据分配多少 char *Data = malloc(1024*1024); //??????? sprintf(Data, "%s %s", Data1, Data2); 数据1和数据2的大小不时变化。。。。从很长到很小 我想知道,如果不分配内存或其他什么,是否可以使用sprintf,因为分配的内存有时可能会很小 谢谢因为数据1和数据2似乎是字符串,所以只需使用strlen()并分配实际需要的内存量即可 char *data = mallo

问题是我不知道字符串的长度,所以我不知道应该为我的数据分配多少

char *Data = malloc(1024*1024);  //???????
sprintf(Data, "%s %s", Data1, Data2);
数据1和数据2的大小不时变化。。。。从很长到很小 我想知道,如果不分配内存或其他什么,是否可以使用sprintf,因为分配的内存有时可能会很小


谢谢

因为数据1和数据2似乎是字符串,所以只需使用strlen()并分配实际需要的内存量即可

char *data = malloc(sizeof(char) * (strlen(data1) + strlen(data2) + 1));
不要使用
sprintf()
而使用
snprintf()
,它将永远不会溢出缓冲区(您可以告诉它缓冲区有多大)
snprintf()
还将告诉您需要多大的缓冲区才能避免截断结果

请注意,MSVC没有
snprintf()
,但包含类似的
\u snprintf()
。但是,该功能与标准至少有两个区别:

  • 它可能会使结果不确定
  • 如果它确实截断了,它不会告诉您需要多大的缓冲区

如果您使用MSVC,您可能需要考虑使用(具有自由许可)。

< P>许多C运行库(例如,GNU的GLUBC和FreeBSD的(和NETBSD和OpenBSD的和OS X的)LIB)提供的,它将<代码> Malc C < /C> >和<代码> SaveFF < /C> >单个调用。

char *Data = NULL;
asprintf(&data, "%s %s", Data1, Data2);

假设返回值表示成功,则为字符串动态分配了足够的空间,当不再使用该字符串时,您应
释放该字符串。

简短的回答是否

…但您不需要每次运行代码时都进行分配。根据您的程序是否是多线程的、这段代码运行的频率以及您期望的最大字符串的大小,您最好只分配一次“最大可能大小”的缓冲区,然后使用安全版本的sprintf(如snprintf)来填充它。(防止超支)。或者,如果所需大小超过当前缓冲区大小,则可以有条件地重新分配缓冲区

例如,如果你使用C++和上面的方法,你可以将你的数据分配线改为:

static char *Data = malloc(1024*1024);
方法中使用的static关键字承诺局部变量只会初始化一次——第一次调用该行时,它将超出该方法调用的范围

如果您使用的是C,那么您的缓冲区可以是全局的(我不喜欢这个),或者您可以传递一个指向本地范围的数据缓冲区的指针。我相信真正的C程序员对如何做这类事情有更好的建议


我知道,只有一个巨大的缓冲区,而你几乎从来没有充分利用它,这似乎是低效的,但事实证明,对于大多数应用程序来说,分配的开销是一个比堆空间耗尽的可能性更大的问题。

不可能。您必须始终分配sprintf/printf使用的缓冲区,为什么不使用strlen函数来分配字符串大小

char *buf = malloc(strlen(Data1) + strlen(Data2) + 2); // 2 for space and \0
sprintf(buf, "%s %s", Data1, Data2);

这解决了在运行时需要计算数据1和数据2的大小的问题。

是否需要详细说明数据1/数据2是什么?不过,我可能会同意使用.Convention。在C语言中,通常所有内容都是小写的。在OO语言中,以大写字母开头的单词通常表示类。请看一看确切的副本否,抱歉,我没有指出,它们被称为函数,data1和data2,还有6个,我不能调用每个函数两次来计算它们的长度,然后再调用它们来用sprintf sprintf打印它们(数据,“%s%s%s%s%s%s%s%s”,function1,function2,function3,function4,function5,function6,function7,function8,function9)@killercode:那么
Data1
Data2
是返回
char*
的函数吗?如果是这样,请将结果保存到另一个指针(例如,
char*tmp1=Data1(),*tmp2=Data2();size_t len1=strlen(tmp1),len2=strlen(tmp2);char*data=malloc(len1+len2+1);
,等等)。您应该将分配字符串的大小计算为:sizeof(char)*(strlen)(strlen(Data1)+strlen(Data2)+2.一个用于分隔串联字符串的空格字符,另一个用于终止字符串的空字符。好吧,即使它与目标平台上的标准库在同一个包中提供,它也不会在“标准库”中。更好的方法是“许多C运行时库都带有非标准”asprintf“,它结合了…”“/回答得很好!非常感谢!”:-)