2013-04-21 3 views
1

Я все еще учу C. Я реализовал простую программу словесного слова. Во время игры с debug я видел, что мой указатель фактически указывает значение истинной памяти, но когда я инициализирую массив char (другой), указатель, который указывает другой массив символов, также инициализируется. Вот начало кода:C указатель неправильного значения?

char *theword = pickAWord();//returns a word from .dat file 
char guess[40]; //guess = 0x003afa94 
char guessedWord[20]; //guessedWord = 0x003afa78 
char play_again; 
char *guessedWordp = guessedWord; //guessedWordp = 0x003afa78 

int guessedWordIndex = 0; 
int a = strlen(theword)-1; 
int found = 0; 
int *foundp = &found; 
int *hakp = &hak; 
int *guessedWordIndexp = &guessedWordIndex; 

Когда я инициализировать догадываюсь массив символов, как это:

for(i=0; i<a; i++){ 
    guess[i*2] = '_'; 
    guess[i*2+1] = ' '; 
    if(i==a-1) guess[i*2+1] = '\0'; 
} 

Внезапно * guessedWordp указатель и массив значений изменения, как это:

guessedWordp = 0x003afa78 "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ_ _ _ _ _ _ _" 
guessedWord = 0x003afa78 "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ_ _ _ _ _ _ _" 

Мне просто интересно, почему «_ _ _ _ _ _ _» это добавлено в конце угадываемого указателяWordp, когда я фактически инициализирую его для угадывания массива символов (массив угадывания, инициализированный с помощью Corret значение, кстати)

Я использую Visual Studio 2010

+2

Две вещи выделяются как важные и не снабжаются этим кодом: 1) Как 'pickAWord()' выделяет строку возврата, адрес которой сохраняется в 'theWord', и 2) Какие гарантии у вас есть слово составляет менее 20 символов? В другом месте блок 'if' в цикле' for' не нужен, так как то, что вы пытаетесь сделать *, может быть выполнено * после * цикла. И я немного подозрительно даже спросить, как «play_again» используется позже. – WhozCraig

+0

1-) значение возвращаемого значения отличается от других. 2-) слова в документе ниже 20 символов. Если я не добавляю if-if, то значение угадывания - это угадать = 0x002afaa8 "_ _ _ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌHÅ". Означает, что массив символов никогда не заканчивается из-за отсутствия «\ 0». Я не знаю, в чем причина, поскольку я новичок в c. play_again используется как в конце игры, если (play_again == 'y') goto play; – onurfoca

+0

ОК. Терминатор в (2) можно задать после цикла. Вы знаете, где 'i' закончился (' a'), поэтому 'guess [2 * a -1] = 0' после достаточного цикла. Проверьте математику и посмотрите. И для 'play_again' было не так много, как вы * оцениваете *, на что я был против, это было больше, как вы * заполняете его. – WhozCraig

ответ

4

Вы можете игнорировать его, это бессмысленно. Вы не инициализировали guessedWord, и это то, что guessedWordp указывает. Таким образом, содержание совершенно бессмысленно.

Если хотите, добавьте guessedWord[0] = 0;, чтобы инициализировать guessedWord пустой веревке, и тайна исчезнет.

+0

+1 Иногда я не вижу лес для деревьев. На самом деле это хорошо сделано. – WhozCraig

Смежные вопросы