我在内存受限的环境中工作,需要动态创建字符串,但仍然不会占用堆内存。这是否有意义:
static char staticStringBuffer[10240];
static size_t staticStringWatermark = 0;
void createString( const char * something, const char * somethingElse ) {
char buf[1024];
strcat(buf, "test");
strcat(buf, something);
strcat(buf, somethingElse);
strcat(&staticStringBuffer[staticStringWatermark], buf);
staticStringWatermark += strlen(buf+1);
}
这可能是编译,但是我正在尝试理智 - 为堆内存牺牲静态内存?
谢谢你^ _ ^
答案 0 :(得分:4)
这当然取决于您的特定环境在加载程序时的作用;程序的静态数据放在哪里?在许多操作系统上,程序被加载到堆内存中并从那里运行,因此静态数据仍然会在堆上结束。
答案 1 :(得分:1)
那会有效。需要注意的是不要在静态缓冲区的末尾写入,如果strlen(某事物)+ strlen(somethingElse)> = 10240,则会在您的示例中发生。
答案 2 :(得分:1)
我同意放松。
当强制使用静态分配时,我通常会在它们使用的范围内分配这些块,即在函数本身内。
即
static char *createstring(char *foo, char *bar)
{
static char ret[size];
/* do some work, make sure you pay attention to the printf sub system when it
tells you how many bytes weren't printed ... */
return ret;
}
..当然,确保进入createstring()的行为受到某种互斥的保护,并且调用者不需要修改结果。
取决于您的编译器,YMMV。你真的需要做那些全球性的吗?
答案 3 :(得分:0)
如果内存确实是限制性的,你不能将/ strcat直接附加到staticStringBuffer而不是你的临时buf吗?
我知道这段代码不是线程安全的吗?你可能不需要它,但只是确定。
还使用strncat而不是strcat - 它可以防止缓冲区溢出。
答案 4 :(得分:0)
如果需要动态创建字符串,则需要一个堆,但不一定是C运行时库提供的默认堆。如果您处于非常有限的环境中,请不要动态创建字符串。