Я работаю в ограниченной среде памяти и потребности создать строки динамично, но все еще иметь их не поднимают память "кучи". Делает это имеет смысл:
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);
}
Это, вероятно, обучающая компиляция, но то, чего я делаю попытку нормальный - жертвующий статическим ЗУ за память "кучи"?
Слова благодарности ^_^
Это конечно, зависит от того, что делает ваша конкретная среда, когда загружает вашу программу; куда помещаются статические данные программы? Во многих операционных системах программа загружается в динамическую память и запускается оттуда, поэтому ваши статические данные все равно останутся в куче.
Я согласен с раскручиванием.
Когда я вынужден использовать статическое распределение, я обычно выделяю эти блоки в пределах области, в которой они используются, то есть внутри самой функции.
т.е.
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. Вам действительно нужно сделать их глобальными?
Если вам нужно создавать строки динамически, вам понадобится куча, хотя и не обязательно та, которая по умолчанию поставляется с вашей библиотекой времени выполнения C. Если вы находитесь в очень ограниченной среде, не создавайте строки динамически.
Это сработает. Следует проявлять осторожность, чтобы не писать дальше конца статического буфера, что могло бы произойти в вашем примере, если strlen (something) + strlen (somethingElse)> = 10240.
Если память действительно настолько ограничена, не могли бы вы добавить / strcat прямо в staticStringBuffer, а не в свой временный буфер?
Я так понимаю, вы знаете, что этот код не является потокобезопасным? Возможно, вам это не нужно, но просто убедитесь.
Также используйте strncat вместо strcat - это предотвращает переполнение буфера.