静态内存vs堆内存?

时间:2010-02-16 10:03:52

标签: c memory

我在内存受限的环境中工作,需要动态创建字符串,但仍然不会占用堆内存。这是否有意义:

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);
}

这可能是编译,但是我正在尝试理智 - 为堆内存牺牲静态内存?

谢谢你^ _ ^

5 个答案:

答案 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运行时库提供的默认堆。如果您处于非常有限的环境中,请不要动态创建字符串。