Я предполагаю, что вы имеете в виду C, поскольку это один из самых распространенных скомпилированных языков, где у вас возникнет эта проблема.
Переменные, которые вы объявляете в функции, хранятся в стеке .Это хорошо и эффективно, очищается при выходе из функции и т. Д. Единственная проблема заключается в том, что размер слота стека для каждой функции фиксирован и не может изменяться во время работы функции.
Второе местоВы можете выделить память это куча .Это бесплатный для всех, что вы можете выделить и освободить память во время выполнения.Вы выделяете с помощью malloc (), а когда закончите, вызываете free () для него (это важно во избежание утечек памяти).
При выделении кучи вы должны знать размер при alloc время, но это лучше, чем хранить его в фиксированном стековом пространстве, которое невозможно увеличить при необходимости.
Это простая и глупая функция для декодирования строки в ее ASCII-коды с использованием динамически выделяемого буфера:
char* str_to_ascii_codes(char* str)
{
size_t i;
size_t str_length = strlen(str);
char* ascii_codes = malloc(str_length*4+1);
for(i = 0; i<str_length; i++)
snprintf(ascii_codes+i*4, 5, "%03d ", str[i]);
return ascii_codes;
}
Редактировать: Вы упомянули в комментарии, желая получить буфер правильно.Я обрезал углы с помощью приведенного выше примера, сделав каждую запись в строке известной длины и не обрезая лишний пробел в результате.Это более умная версия, которая устраняет обе эти проблемы:
char* str_to_ascii_codes(char* str)
{
size_t i;
int written;
size_t str_length = strlen(str), ascii_codes_length = 0;
char* ascii_codes = malloc(str_length*4+1);
for(i = 0; i<str_length; i++)
{
snprintf(ascii_codes+ascii_codes_length, 5, "%d %n", str[i], &written);
ascii_codes_length = ascii_codes_length + written;
}
/* This is intentionally one byte short, to trim the trailing space char */
ascii_codes = realloc(ascii_codes, ascii_codes_length);
/* Add new end-of-string marker */
ascii_codes[ascii_codes_length-1] = '\0';
return ascii_codes;
}