«Выделение» объекта с примитивным типом данных и с автоматической продолжительностью хранения обычно не имеет большого значения.Вопрос больше: хотите ли вы, чтобы содержимое foo
выдерживало выполнение функции или нет?
Рассмотрим, например, следующую функцию:
char* bar() {
char foo[LENGTH];
strcpy(foo, "Hello!");
return foo; // returning a pointer to a local variable; undefined behaviour if someone will use it.
}
В этомcase, foo
выйдет из области видимости и не будет (юридически) доступен после завершения bar
.
Однако все в порядке, если вы напишите
char* bar() {
static char foo[LENGTH];
strcpy(foo, "Hello!");
return foo; // foo has static storage duration and will be destroyed at the end of your program (not at the end of bar())
}
Может возникнуть проблема с большими переменными с автоматической продолжительностью хранения, если они станут такими большими, что они превысят (ограниченный) стекразмер, или если вы вызываете функцию рекурсивно.Однако, чтобы преодолеть эту проблему, вам нужно вместо этого использовать динамическое выделение памяти (т. Е. New / delete).