Ваша проблема в том, что внутри цикла вы пишете *option_string++
. Это означает, что, как только цикл будет завершен, вы будете указывать за конец строки:
option_string at start
|
V
+----+----+----+----+----+
| | | | | |
| | | | | |
+----+----+----+----+----+
^
|
option_string at end
Обратите внимание, что это показывает вторую проблему с вашим кодом: строки в C заканчиваются нулем, но эта строка в конечном итоге будет содержать "aaaaa", а затем ... кто знает? Мусор, скорее всего, но вы не можете сказать. Вам нужна строка из шести длин. Исправление первой проблемы означает использование простой индексации: option_string[j] = 'a'
. Если вы действительно хотите метод *option_string++
, вам придется сохранить и восстановить option_string
(char * real_option_string = option_string; ... option_string = real_option_string;
), но я бы не рекомендовал его. Исправление обеих этих ошибок и нескольких стилевых вещей дает вам:
#include <stdlib.h>
#include <stdio.h>
int main (void)
{
char * option_string = calloc(6, sizeof(char));
int j;
for ( j = 0; j < 5; j++)
{
option_string[j] = 'a';
}
printf("print options_string: %s\n", option_string);
free(option_string);
return 0;
}
Еще одна вещь, которую я изменил, была твоя malloc
. Я чувствую, что calloc
- лучший стилистический выбор здесь; calloc(count, size)
выделяет count
объекты размером size
и обнуляет их. Это как malloc(count*size)
плюс memset, но мне кажется чище. Вы также не должны иметь приведение к malloc
/ calloc
/ и т. Д., Вообще говоря (это может скрыть полезные предупреждения), и вам нужно выделить шесть слотов, как я уже сказал (так что вы может иметь нулевой терминатор, который является нулевым символом, поэтому нам не нужно устанавливать его явно). Объедините это с режимом индексирования option_string[j]
, добавьте пропущенный stdlib.h
для calloc
(он должен был быть и для malloc
), и мы готовы!