C语言如何确定一个指针是否已分配过的内存

C中可以用malloc()为指针分配内存,但是当我们不知道前面是些什么操作,的时候如何来确定某个指针的指向是否是已近分配过内存区域呢。比如说我只知道s是一个char*型的... C中可以用malloc()为指针分配内存,但是当我们不知道前面是些什么操作,的时候如何来确定某个指针的指向是否是已近分配过内存区域呢。
比如说我只知道s是一个char *型的变量,如何确定s的指向是否是一个已经申请过的内存空间呢,用判断s是否等于NULL好像不是很管用,因为刚申明后的变量是随机分配值的,不能够保证一定为NULL啊。
谢谢。。。。
展开
 我来答
出家人词悲
高赞答主

2016-01-22 · 大脑停止不了思考
知道大有可为答主
回答量:1.4万
采纳率:12%
帮助的人:3925万
展开全部
指针变量与内存分配
1. char * str1;
//str1 只是一个指针,指针指向的空间还没有分配,所以此时用strcpy向str1所指向的内存
中拷贝内容将出错。利用malloc动态分配指向的内存(在堆中):
str1=(char *)malloc(10) or str1=(char *)malloc(sizeof(char) * num)//分配num个char
所占有的字节(一般是1个字节)数空间,用完后必须用free释放内存空间。这与在栈中自动
分配的内存不同,栈中的内存在函数结束后自动释放。

2.char str2[10];//字符数组的赋值要么在声明时初始化(="dfdf"or ={'a','b','c','d'},要末一个字符的赋值,str[0]= ;str[1]= ;...... 或者strcpy(str2,"aaaaaa")(因为内存空间已分好);
如果char str2[10]; str2="abcdefgjk";就会出错,因为str2表示数组str2[10]的首地址,在声明数组时已经分配好了地址值,不是变量,而是常量。strcpy(str2,"aaaaaa")这种数组初始化方式,是将"aaaaaa"拷贝到以str2为开始地址的内存空间当中。

3。
char *str1;
char str2[10]="dfdf";
str1=str2;
//将指针str1指向以str2为首地址的内存空间,即现在str2和str1表示内存中的同一区域.

4。char * str3="aaaaaaaaaaaaaaa";
char * str2="bbbb";
strcpy(str3,str2);
//这时的str2和str3就不指向同一内存空间,因为str3在初始化时已经分配了指向的内存空间;此时只是将str2所指向的内存的内容拷贝到str3所指向的内存空间的内容(注意:str3指向的内存空间的大小最好大于str2所指向的内存空间的大小,否则,可能将其他变量的内存覆盖。另外,c语言对数组不做越界检查,使用时候小心,否则出现不可预料的错误)。

5。其它如int,double,float,short等类型,在申明变量时内存空间就已经分配好了。例如:
int i=1;
int j;
j=i;
j=2;
printf("i=[%d];j=[%d]\n",i,j);
输出结果为i=1;j=2

6。面向对象编程例如java中的对象声明,句柄和指针的情况类似
Object myObj = NEW Object()
对象句柄myObj指向New在内存中创建的实例
声明了对象以后必须实例化,才能调用对象的方法。
ObjectA youObj=New ObjectA();

myObj=youObj//myObj和youObj同时指向ObjectA的实例

7.图例:
char *str1="abcd",*str2="cde";//"abcd"的首地址为2000,"cde"的首地址为2004,分别存放在str1和str2.

address(int类型) address(int类型)strings or object
------ ------
str1 |2000| -----------------2000| |: memory1
------ ...
str2 |2004| -----------------2004| |: memory2
------ ...
| | 2007| |
------ ------
| | | |
------ ------
(1) str1=str2; //str1的值变为2004,指向了memory2
(2) strcpy(str1,str2);//将memory2的内容"cde"拷贝到memory1,str1仍指向memory1
kdsj\0fkdjfkdj\0fkdjfkjdfk\0

8.总结:
内存的地址是固定的,而地址所指向的内存中的内容是变化的
指针是存放地址的变量;
strcpy是内存区域中的内容的拷贝,而内存的地址是固定不变的。
字符数组char str[10];与 char *str;的区别:

字符数组在变量声明时即已分配了内存空间,也就是说他的地址已经确定了,而字
符指针没有指向内存空间(除了char *str="dfdf")。
字符数组中str表示数组的首地址,是一个常量,str等于一个固定的内存地址,所
以永远不能在等号左边被赋值(除了声明变量初始化时,char str[10]="sssssss"),
只能利用strcpy来改变他所指向的内存空间的内容。

而char *str中str是一个变量,可以指向任意内存空间,;str=str2只表示将str指向
地址str2指向的内存空间;他同样必须用strcpy来改变str所指向的内存区域的内容。
注意:指针仅仅起指向的作用!!
最常见的例子是:
fgets(str,1000,fp);//预先定义str为字符数组char str[1000],
因为不确定文件的一行有多长
fetch into :str;//同上

9. C语言函数中的局部变量的空间一般都是放在堆栈里面.在进入函数前,通过"SUB SP,+XX"来为这些局部变量分配堆栈空间.然后同样通过BP来对这些局部变量进行访问.函数结束时,"MOV SP,BP"还原堆栈指针,局部变量随之而消失.最后以"POP BP"还原BP,结束该函数.
值得注意的是,C语言会自动为C函数中经常使用int类型变量设置成resigter int.这样的局部变量就不是使用堆栈空间的了,而就是直接使用SI寄存器.

10. char str[10];
struct aa bb;
........
memset(str,'\0',sizeof(str));//清空内存,赋值为10个'\0'字符
memset(&bb,0,sizeof(struct aa));
从文件中逐行读取,可以处理完一行,memset一下,再读取下一行

strcat(str1,str2);//也要注意str1最好是定长的数组,如果是指针还要初始化,还要
长度。
字符串比较大小只能用strcmp,strncmp
strcmp(str1,str2)// =0相等,否则不等
strncmp(str1,str2,n)// 比较str1和str2的前n个字符
函数:
atoi//将字符串转为整数
char *itoa(int value, char *string, int radix); //将整数转为字符串

11.注意:char *str1;
str1=(char *)malloc(sizeof(char) * num)
给指针分配他所指向的内存空间的大小,sizeof函数是取得变量类型或者变量所占用
的内存字节数。例如:
sizeof(int)//结果为4(个字节)
sizeof(double)//结果为8(个字节)
char str[]="qqqqqq";sizeof(str)//结果为7(个字节),不要漏掉'\0'!!!
char *str="qqqqqq";sizeof(str)//结果为4(个字节)(32为操作系统),因为str是指针变量!!!

注意:指针变量(存放地址的变量)的sizeof值一般都为4,不要将所占用内存大小和字符串
长度混淆!!!
例如:char str[10]={'a','b','c'};
strlen(str)//值为3
sizeof(str)//值为10
sizeof(char) * strlen(str)//值为3

C语言中数组定义几位,元素的最大个数就是几位。例如char str[10];元素的最大个数
为10,只不过字符数组自动在最末尾加'\0',所以定义字符数组的时候要小心,你想定
义一个有2个字符的数组,就要char str[3];,留出一位给'\0',strlen为2,sizeof为
3!!!!

12. return语句不可返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被
自动销毁。但是可以return一个在“栈内存”的整型变量,因为返回的是内存中的值。
例如
char * Func(void)
{
char str[] = “hello world”; // str的内存位于栈上
.......
return str; //函数结束时候str为首地址的内存即刻释放,只是返回一个内存的地址
}
main( )
{ char *str1;
str1=Func;
printf("%s\n",str);// 将导致错误
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式