示例程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char dest[] = "Hello A World";
char sour= 'A'; //定义字符变量,并初始化
char ch_temp; //定义字符变量
char *TEMP; //定义字符指针,但是其“值”为乱码,也即“野指针”
char *ptemp = NULL; //定义字符指针,并初始化为NULL
char *PTEMP = 0; //定义字符指针,并初始化为0
char *PTemp = (char *)malloc(sizeof(char)); //通过malloc函数在堆上面分配内存,
int in_temp; //定义一个整形变量,但为初始化
int in_TEMP = 1; //定义一个整形变量,并初始化
return 0;
}
调试结束时,变量情况:
分析:
1、定义变量,未初始化:
char ch_temp 、int in_temp 为初始化,在Debug模式下,debug是将每个字节位都赋成0xcc,因此 ch_temp为0Xcc、in_temp为0xcccccccc;
2、定义指针变量,未初始化:
char *TEMP
在 Debug 模式下,VC 会把未初始化的栈内存上的指针全部填成 0xcccccccc ,当字符串看就是 “烫烫烫烫……”
因此,在定义变量是,要及时初始化!
定义指针变量时,两种方式对待:
扫描二维码关注公众号,回复:
10375367 查看本文章
(1)、定义指针变量,临时不用指针变量:将指针变量置NULL/0;就是将指针变量置为空指针;在用到的时候,然后用malloc、free函数在堆上面进行内存分配和释放;
(2)、定义指针变量,并且用到指针变量:直接用malloc、free函数在堆上面进行内存分配和释放;
示例如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char *TEMP; //定义字符指针,但是其“值”为乱码,也即“野指针”
char *ptemp = NULL; //定义字符指针,并初始化为NULL
char *PTEMP = 0; //定义字符指针,并初始化为0
//先定义,并将指针置空,后面用的时候,在malloc分配内存
char *PTemp = NULL;
PTemp = (char *)malloc(sizeof(char));
//先定义,并将指针置空,后面用的时候,在malloc分配内存
char *PTEmp = 0;
PTEmp = (char *)malloc(sizeof(char));
//直接定义并通过malloc函数在堆上面分配内存,
char *PTEMp = (char *)malloc(sizeof(char));
return 0;
}
指针初始化的范例:
示例程序:
(1)
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* a;
*a = 1;
system("pause");
return 0;
}
解析:整型指针变量a,没有初始化;既指针a存放地值(地址)为随机值,也就是平常说的“野指针”;
运行结果:
(2)
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* a = NULL;
*a = 1;
printf("*a=%d\n",*a);
system("pause");
return 0;
}
分析:这是因为NULL指针是一个特殊的指针变量,不指向任何内存,用来表示这个指针目前未指向任何位置。
所以对NULL指针进行解引用操作是非法的。
对指针进行解引用之前,要确定它不是NULL指针!
运行结果:无任何输出结果!
(3)
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n = 0;
int* a = NULL;
a = &n;
*a = 1;
printf("*a=%d n=%d\n",*a, n);
system("pause");
return 0;
}
分析:首先对整型指针变量a初始化,指向NULL;然后将其指向整形变量n,因此,整型指针变量a的值为变量n的地址,有效!
运行结果:
参考链接: