【问题标题】:cygwin char pointer and char address-------compare two scanf programcygwin char指针和char地址-----比较两个scanf程序
【发布时间】:2013-10-11 05:49:01
【问题描述】:

我最近用了cygwin和gcc一个简单的c程序,但是发生了一些奇怪的事情,不知道为什么?

#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
▒

【问题讨论】:

    标签: c pointers cygwin scanf


    【解决方案1】:

    因为在第二个代码中(读取 cmets):

    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*

    【讨论】:

      【解决方案2】:

      试图扫描到未初始化的指针

      这样修改

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

      【讨论】:

        猜你喜欢
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多