在C中打印字符指针

Ash*_*uja -5 c pointers

当我编写以下代码时,我正在学习C中的指针:

#include <stdio.h>
main()
{
    char *p = 0;
    *p = 'a';
    printf("value in pointer p is %c\n", *p);
}
Run Code Online (Sandbox Code Playgroud)

当我编译代码时,它已成功编译.虽然,当我执行其out文件时,发生了一个runt-time错误:Segmentation Fault (core dumped)

我无法理解为什么会发生运行时错误.毕竟,指针p指向字符a,因此输出应该是a.

虽然,当我编写以下代码时,它已成功编译并运行:

#include <stdio.h>
main ()
{
    char *p = 0;
    char output = 'a';
    p = &output;
    printf("value which pointer p points is %c\n", *p);
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么第一个程序失败,而第二个程序成功运行?

Iha*_*imi 11

您的代码调用未定义的行为,因为您正在取消引用NULL1指针.指针需要指向有效的内存,这是实现你想要的简单方法

#include <stdio.h>

int // `main()' MUST return `int'
main(void)
{
    char *pointer;
    char value;

    pointer = &value; // Now the pointer points to valid memory
    *pointer = 'a';

    printf("value in pointer p is %c\n", *pointer);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

1 6.3.2.3指针

  1. 值为0的整型常量表达式或此类表达式转换为类型void *称为空指针常量.66)如果将空指针常量转换为指针类型,则保证将结果指针(称为空指针)与指向任何对象或函数的指针进行比较.

66)NULL定义于(和其他标题)作为空指针常量; 见7.19.

6.5.3.2地址和间接运营商

语义

  1. 一元运算*符表示间接.如果操作数指向函数,则结果是函数指示符; 如果它指向一个对象,则结果是指定该对象的左值.如果操作数的类型为''指向类型'',则结果的类型为''type''.如果为指针分配了无效值,则unary*运算符的行为未定义.102)

102)因此,&*E等效于E(即使E是一个空指针),和&(E1[E2])((E1)+(E2)).如果E是函数指示符或者是一元运算&符的有效操作数的左值,则总是如此,*&E是函数指示符或等于的左值E.如果*P是左值并且T是对象指针类型的名称,*(T)P左值是具有与T点相对应的类型的左值.

在由一元运算*符解除引用指针的无效值中,有一个空指针,一个与指向的对象类型不适当对齐的地址,以及一个对象在其生命周期结束后的地址.

  • 指针变量"指向"另一个变量.那就是:`char v; char*p;`然后`p =&v;`将`p`设置为`v`s地址("指向v").顺从`p`(`*p`)是为了访问它指向的变量(在这种情况下为`v`).所以,`*p ='x';`将字符'x'放在`v`和`printf("%c",*p);`将打印'v`中的任何字符('x'在此例). (4认同)