C: что не так с этим назначением указателя символа? - PullRequest
0 голосов
/ 30 ноября 2010

Вопрос новичка:

Я тренировался с указателем на символ, но обнаружил, что ничего не распечатано Вот код:

#include <stdio.h>

int main (void)
{
    char * option_string = NULL;
    option_string = (char*)malloc(sizeof(5));
    memset(option_string, 0, sizeof(char) * 5);

    int j;
    for ( j = 0; j < 5; j++)
    {
        *option_string++ = 'a';
    }

    printf("print options_string: %s\n", option_string); //!nothing was printed out!
    free(option_string);
    return 0; 
}

Заранее спасибо!

Ответы [ 3 ]

11 голосов
/ 30 ноября 2010

Вы увеличиваете указатель option_string, который, в свою очередь, указывает на конец строки.

Try таНос (6);

for ( j = 0; j < 5; j++)
{
    option_string[j] = 'a';
}

вместо.

8 голосов
/ 30 ноября 2010

Ваш malloc(sizeof(5)) кажется неправильным.Какой размер 5?(Подсказка: это не 5).

4 голосов
/ 30 ноября 2010

Ваша проблема в том, что внутри цикла вы пишете *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), и мы готовы!

...