Я все еще учу 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
Две вещи выделяются как важные и не снабжаются этим кодом: 1) Как 'pickAWord()' выделяет строку возврата, адрес которой сохраняется в 'theWord', и 2) Какие гарантии у вас есть слово составляет менее 20 символов? В другом месте блок 'if' в цикле' for' не нужен, так как то, что вы пытаетесь сделать *, может быть выполнено * после * цикла. И я немного подозрительно даже спросить, как «play_again» используется позже. – WhozCraig
1-) значение возвращаемого значения отличается от других. 2-) слова в документе ниже 20 символов. Если я не добавляю if-if, то значение угадывания - это угадать = 0x002afaa8 "_ _ _ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌHÅ". Означает, что массив символов никогда не заканчивается из-за отсутствия «\ 0». Я не знаю, в чем причина, поскольку я новичок в c. play_again используется как в конце игры, если (play_again == 'y') goto play; – onurfoca
ОК. Терминатор в (2) можно задать после цикла. Вы знаете, где 'i' закончился (' a'), поэтому 'guess [2 * a -1] = 0' после достаточного цикла. Проверьте математику и посмотрите. И для 'play_again' было не так много, как вы * оцениваете *, на что я был против, это было больше, как вы * заполняете его. – WhozCraig