2013-10-11 2 views
1

Недавно я использовал cygwin и gcc простую программу c, но что-то странное случается, я не знаю почему?cygwin char pointer и char address ------- сравнить две программы scanf

#include <stdio.h> 

int main(void) { 
    char in; 
    scanf("%c",&in); 
    printf("%c\n",in); 
    return 0; 
} 

Это выход эти:

$ ./a.exe 
1 
1 

во время следующей программы,

#include <stdio.h> 

int main(void) { 
    char* in; 
    scanf("%c",in); 
    printf("%c\n",in); 
    return 0; 
} 

Это выход этот:

$ ./a.exe 
1 
▒ 

ответ

3

Потому что во втором коде (читать комментарии):

int main(void) { 
    char* in; // garbage value 
    scanf("%c",in); // storing at garbage address 
    printf("%c\n",in); 
    return 0; 
} 

in - неинициализированный указатель, указывающий на место мусора - неопределенное поведение.

Конечно, синтаксически это правильно! Вы можете использовать его следующим образом:

int main(void) { 
    char c; 
    char* in = &c; // pointing to valid address 
    scanf("%c",in); 
    printf("%c\n", *in); 
    return 0; 
} 

Примечание Printf изменение, которое я добавил * оператор разыменования для печати значение,

printf("%c\n", *in); 
      ^

Для печати адреса использования %p и приведение типа адреса в void*

1

Попытка сканирования в неинициализированный указатель

Изменить следующим образом

char* in=malloc(1); 
    scanf("%c",in); 
    printf("%c\n",*in); 
        ^^ You should use *in to print the value