为什么printf()在使用指针时绕过分段失败?

Haz*_*Bot 1 c printf pointers scanf segmentation-fault

我一直在测试C中点的编码操作,我经历了一个我无法解释的奇怪现象.

以下代码只是实例化四个双变量并接收用户输入以填充所有变量.

奇怪的是注释掉的行,当没有注释行时代码按预期工作,但是当我注释掉它时,循环中的分段失败.

我一直在编写这个测试 c9.io

码:

#include <stdio.h>

int main() {
    double i, a, b, c, d;
    double * cur = &a;
    char ch = 'a';
    // printf("a - %p\nb - %p\nc - %p\nd - %p\n",&a, &b, &c, &d);
    for (i=0; i<4; i++) {
        printf("Enter %c: ", ch++);
        scanf("%lf", cur++);
    }
    printf("a - %lf\nb - %lf\nc - %lf\nd - %lf\n",a, b, c, d);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不知所措,为什么打印地址绕过分段失败?

Sou*_*osh 5

在你的代码中,

 double * cur = &a;
Run Code Online (Sandbox Code Playgroud)

然后做

 scanf("%lf", cur++);
Run Code Online (Sandbox Code Playgroud)

没有指向a,b,c,d连续变量,你可能已经预期.它只是未定义的行为.

FWIW尝试访问超出范围的内存,调用未定义的行为.

在情况下,你要保持同样的办法,你可以定义a(而不是像独立的变量作为数组a,b,c,d),然后就可以使用cur遍历了数组.数组成员始终是连续的.