Если вы хотите сделать это во время компиляции (это единственный способ выполнить инициализаторы, аналогичные тем, что есть в вашем вопросе), вы можете позволить инициализатору определить размер для вашего массива:
char string[] = {34,34,34,21,45,12,45,12, 0}; // added a 0 to the end to
// make it '\0' terminated
// You might not need that
Если вы хотите, чтобы ваша строка брала данные из источника времени выполнения (из файла или другого ввода), вам нужно будет выполнить выделение самостоятельно, и как именно это сделать, зависит от того, как вы собираетесь бытьполучать данные.
В следующем примере данные из stdin
считываются в динамически размещаемый символьный массив, увеличивая массив по мере необходимости до достижения EOF.Он увеличивает массив на 20 байт каждый раз, так что вы можете легко проверить, что происходит в отладчике, но реальной программе лучше бы увеличить на что-то большее, например, удвоив размер или просто увеличивая с шагом 100 КБ - подробности вашегоОжидаемые данные должны помочь вам принять это решение).
#include <stdlib.h>
#include <stdio.h>
void fatal_error(void);
int main( int argc, char** argv)
{
int buf_size = 0;
int buf_used = 0;
char* buf = NULL;
char* tmp = NULL;
char c;
int i = 0;
while ((c = getchar()) != EOF) {
if (buf_used == buf_size) {
//need more space in the array
buf_size += 20;
tmp = realloc(buf, buf_size); // get a new larger array
if (!tmp) fatal_error();
buf = tmp;
}
buf[buf_used] = c; // pointer can be indexed like an array
++buf_used;
}
puts("\n\n*** Dump of stdin ***\n");
for (i = 0; i < buf_used; ++i) {
putchar(buf[i]);
}
free(buf);
return 0;
}
void fatal_error(void)
{
fputs("fatal error - out of memory\n", stderr);
exit(1);
}