【C 语言】指针数据类型 ( 不允许向 NULL 地址写入数据 | 不允许不断地改变指针指向 | 字面量存放位置 )
【摘要】
文章目录
一、不允许向 NULL 地址写入数据二、不允许不断地改变指针指向三、字面量存放位置
一、不允许向 NULL 地址写入数据
声明指针变量 , 并为其 设置 ...
一、不允许向 NULL 地址写入数据
声明指针变量 , 并为其 设置 NULL 初始值 , NULL 就是 0 ;
char *p = NULL;
- 1
注意 , 此时一定不能访问 p
指针变量指向的地址 , 0
地址是操作系统保护地址 , 读写该地址的数据 , 都会报错 ;
C/C++ 中的 NULL
的值为 0 ;
#ifndef NULL
#ifdef __cplusplus
#ifndef _WIN64
#define NULL 0
#else
#define NULL 0LL
#endif /* W64 */
#else
#define NULL ((void *)0)
#endif
#endif
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
如果在声明指针后 , 向 NULL 地址写出数据 , 执行时直接报错 ;
错误代码示例 :
#include <stdio.h>
#include <stdlib.h>
int main()
{
// 声明指针变量 , 并为其设置 NULL 初始值
// NULL 就是 0
char *p = NULL;
// 向 0 地址写出数据会报错
strcpy(p, "123");
// 打印 p 指针内容
printf("%s\n", p);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
执行结果 : 上述代码执行时 , 没有任何响应 ;
二、不允许不断地改变指针指向
指针变量 声明后 , 不断修改 指针变量的值 , 就是 不断改变 指针变量 指向内存空间的位置 ;
上述操作会导致 多个指针变量 , 会 指向同一块内存空间 , 这种做法不会出错 , 但是 容易出现 BUG , 一旦出问题根本找不到原因 ;
代码示例 :
#include <stdio.h>
#include <stdlib.h>
int main()
{
// 声明指针变量 , 并为其设置 NULL 初始值
// NULL 就是 0
char *p = NULL;
char *p2 = NULL;
// 堆内存中申请 20 字节数据
p2 = (char *)malloc(20);
// 为内存赋值
strcpy(p2, "1234567890");
int i = 0;
for(i = 0; i < 10; i++)
{
// 借用 p 指针遍历 p2 指针指向的内存
p = p2 + i;
printf("%c\n", *p);
}
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
执行结果 :
三、字面量存放位置
在代码中 , 如果出现 0
, 1
等字面量 , 如
int a = 0;
- 1
上述 字面量 0
没有放在栈区 , 字面量 无法取地址 , 没有放在 栈区 和 堆区 ;
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/121457268
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)