当我编写以下代码时,我正在学习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指针
- 值为0的整型常量表达式或此类表达式转换为类型
void *称为空指针常量.66)如果将空指针常量转换为指针类型,则保证将结果指针(称为空指针)与指向任何对象或函数的指针进行比较.
66)宏
NULL定义于(和其他标题)作为空指针常量; 见7.19.6.5.3.2地址和间接运营商
语义
- 一元运算
*符表示间接.如果操作数指向函数,则结果是函数指示符; 如果它指向一个对象,则结果是指定该对象的左值.如果操作数的类型为''指向类型'',则结果的类型为''type''.如果为指针分配了无效值,则unary*运算符的行为未定义.102)
102)因此,
&*E等效于E(即使E是一个空指针),和&(E1[E2])到((E1)+(E2)).如果E是函数指示符或者是一元运算&符的有效操作数的左值,则总是如此,*&E是函数指示符或等于的左值E.如果*P是左值并且T是对象指针类型的名称,*(T)P则左值是具有与T点相对应的类型的左值.在由一元运算
*符解除引用指针的无效值中,有一个空指针,一个与指向的对象类型不适当对齐的地址,以及一个对象在其生命周期结束后的地址.