请师兄们一定要帮帮忙,感激不尽!!!!!

chaoyueheike 2009-04-25 05:51:49
1.在程序中我令一个变量,计算机会给其赋予一个地址,这个地址是随机的么,计算机给出这个地址的时候有什么依据没?
2.计算机会挨着分配内存空间的吧,像我前面令了一个变量,给了一个地址假如是-50,后面我又令了一个变量这个时候它应该将-48给这个变量的吧?
3,怎么算开辟内存空间和释放内存空间,开辟的含义我基本上懂,但是释放时什么意思,即如果我开辟了一个内存空间其地址范围是从-50到-10我怎么将这个地址释放出来,释放出来的意思就是说这个内存空间又可以使用了么,既然都是地址为什么还要释放不直接使用,直接在里面存入你要存入的数据不就可以了么? (可不可以直接将你要赋的地址找出来赋值,如-50给这个地址赋一个长度为4的float类型的变量,有没有这种语句?)
我这里有以前师兄们给我得解释,我还是有些不懂,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NULL 0
#define ALLOCSIZE 1000
char allocbuf[ALLOCSIZE];
char * allocp=allocbuf;
char * alloc(int n)
{
if(allocp+n <=allocbuf+ALLOCSIZE)
{allocp+=n;
return(allocp-n);
}
else
return(NULL);
}
free(char *p)
{
if(p>=allocbuf&&p <=allocbuf+ALLOCSIZE)
allocp=p;
}
/***************************************************************************************************/
/* 测试用例*/
int main(void)
{
int *p =NULL;
p = (int *)alloc(8);
*p = 1;
*(p+1) = 2;
printf("%d,%d\n",*p,*(p+1)); //输出1,2
printf("%d\n",*(int *)(allocp-4)); // 输出2 //依照我的理解这里的allocp-4应该是一个没有实际数据的地址变量吧,前面不是将1和2都分别赋给了指针为allocp和allocp+1这两地址了么此时的allocp也是指向的allocbuf[]数组的开头的啊,再将这个地址减去4得到的地址里面会有值么?怎么输出2的?

free((char *)(p+1));
printf("%d\n",*(int *)(allocp-4));
return 0;
}
//然后就是这个,执行了free((char *)(p+1))语句就释放了空间了么,现在释放了哪些范围内的空间,这些范围内的地址在上述程序中就没用使用了么?据我对free函数的理解也最多是:传入的地址如果是在刚才声明的那个数组所占用的地址范围内的话就将p赋值给allocp指针,这说明什么,只能说明将本来指向前面那个数组开头的地址的指针现在该为了指向p+1这个地址了嘛,这样怎么就释放空间了?所以我对释放空间有点迷糊,而且释放空间是不是我前面说的那样释放了的某个空间即地址,程序就没有使用这段指针了,如果是这样,请师兄帮我理解下,这个怎么做到释放的,它释放了那段空间。星号前面的是书上东西应该没有错,后面的是一个师兄给的举例,不知道有没有错,请帮我分析下。
请各位师兄一定要帮帮忙,感激不尽!!!!!!!!!!



...全文
107 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
log290 2009-04-25
  • 打赏
  • 举报
回复
学习
chaoyueheike 2009-04-25
  • 打赏
  • 举报
回复
栈和堆在谭浩强的c语言书里好像没有提到啊,哪里才有?
hityct1 2009-04-25
  • 打赏
  • 举报
回复
1.我想有一定规律,但会因为编译器的不同,地址也会不同。
2.可以自己试试。
chaoyueheike 2009-04-25
  • 打赏
  • 举报
回复
hairetz师兄言重了啊,我也没学好久,深知不足所以求教啊,呵呵,师兄建议我会谨记的,望更多解释,以便参考,谢谢
liliangbao 2009-04-25
  • 打赏
  • 举报
回复
都是高手,帮顶了~
lingyin55 2009-04-25
  • 打赏
  • 举报
回复

这里有以前师兄们给我得解释,我还是有些不懂,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NULL 0
#define ALLOCSIZE 1000
char allocbuf[ALLOCSIZE]; //这里存储的空间是在栈里面的
char * allocp=allocbuf; //定义了一个指针指向了上面的申请的栈空间
char * alloc(int n)
{
if(allocp+n <=allocbuf+ALLOCSIZE)
{allocp+=n;
return(allocp-n);
}
else
return(NULL);
}
free(char *p) //这里肯定有问题,因为你没有动态申请内存,就不能用free了,换句话说,用free的时候,你要看看是不是用
//malloc申请了内存,这两个的使用时配对的
{
if(p>=allocbuf&&p <=allocbuf+ALLOCSIZE)
allocp=p;
}
/***************************************************************************************************/
/* 测试用例*/
int main(void)
{
int *p =NULL;
p = (int *)alloc(8);
*p = 1;
*(p+1) = 2;
printf("%d,%d\n",*p,*(p+1)); //输出1,2
printf("%d\n",*(int *)(allocp-4)); // 输出2 //依照我的理解这里的allocp-4应该是一个没有实际数据的地址变量吧,前面不是将1和2都分别赋给了指针为allocp和allocp+1这两地址了么此时的allocp也是指向的allocbuf[]数组的开头的啊,再将这个地址减去4得到的地址里面会有值么?怎么输出2的?

free((char *)(p+1)); //这里的问题同上面。
printf("%d\n",*(int *)(allocp-4));
return 0;
}
//然后就是这个,
执行了free((char *)(p+1))语句就释放了空间了么,现在释放了哪些范围内的空间


这些范围内的地址在上述程序中就没用使用了么?据我对free函数的理解也最多是:传入的地址如果是在刚才声明的那个数组所占用的地址范围内的话就将p赋值给allocp指针,这说明什么,只能说明将本来指向前面那个数组开头的地址的指针现在该为了指向p+1这个地址了嘛,这样怎么就释放空间了?所以我对释放空间有点迷糊,而且释放空间是不是我前面说的那样释放了的某个空间即地址,程序就没有使用这段指针了,如果是这样,请师兄帮我理解下,这个怎么做到释放的,它释放了那段空间。星号前面的是书上东西应该没有错,后面的是一个师兄给的举例,不知道有没有错,请帮我分析下。
请各位师兄一定要帮帮忙,感激不尽!!!!!!!!!!



链接一篇文章,lz先看看吧
http://hi.baidu.com/newleafzhu/blog/item/e03037f2853757c30b46e021.html
这是几天前这个论坛才讨论过的帖子,也可以看看
http://topic.csdn.net/u/20090421/22/307749e3-933a-457f-9b12-afd22ebe9ce8.html
magipan 2009-04-25
  • 打赏
  • 举报
回复
mark,学习
lingyin55 2009-04-25
  • 打赏
  • 举报
回复

1.在程序中我令一个变量,计算机会给其赋予一个地址,这个地址是随机的么,计算机给出这个地址的时候有什么依据没?
//1、这个地址是随机的。2、程序运行时,系统会分配给程序一个栈空间,一般是1M或2M,程序中不是动态申请的变量都是存储在
//这个栈空间里面,如果是动态分配空间,则是存储在堆里面,这里lz可以查查变量在堆栈的存储,网上很多。
2.计算机会挨着分配内存空间的吧,像我前面令了一个变量,给了一个地址假如是-50,后面我又令了一个变量这个时候它应该将-48给这个变量的吧?
//不一定,但是如果是数组的话那计算机肯定会为它分配一段连续的空间,单个变量的话如果中间有内存已经被使用,那么
//应该会跳开这段内存往下面找空闲的内存。
3,怎么算开辟内存空间和释放内存空间,开辟的含义我基本上懂,但是释放时什么意思,即如果我开辟了一个内存空间其地址范围是从-50到-10我怎么将这个地址释放出来,释放出来的意思就是说这个内存空间又可以使用了么,既然都是地址为什么还要释放不直接使用,直接在里面存入你要存入的数据不就可以了么? (可不可以直接将你要赋的地址找出来赋值,如-50给这个地址赋一个长度为4的float类型的变量,有没有这种语句?)
//这段没怎么看清楚你的意思,开辟内存是在堆上的行为,释放内存的意思就是把这段内存的使用权交还给操作系统,让后面需要内存
//的地方可以使用这个内存。关于这个你可以查查c的malloc和free或者c++的new和delete,一般也会说到如何分配和释放的。

我这里有以前师兄们给我得解释,我还是有些不懂,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NULL 0
#define ALLOCSIZE 1000
char allocbuf[ALLOCSIZE];
char * allocp=allocbuf;
char * alloc(int n)
{
if(allocp+n <=allocbuf+ALLOCSIZE)
{allocp+=n;
return(allocp-n);
}
else
return(NULL);
}
free(char *p)
{
if(p>=allocbuf&&p <=allocbuf+ALLOCSIZE)
allocp=p;
}
/***************************************************************************************************/
/* 测试用例*/
int main(void)
{
int *p =NULL;
p = (int *)alloc(8);
*p = 1;
*(p+1) = 2;
printf("%d,%d\n",*p,*(p+1)); //输出1,2
printf("%d\n",*(int *)(allocp-4)); // 输出2 //依照我的理解这里的allocp-4应该是一个没有实际数据的地址变量吧,前面不是将1和2都分别赋给了指针为allocp和allocp+1这两地址了么此时的allocp也是指向的allocbuf[]数组的开头的啊,再将这个地址减去4得到的地址里面会有值么?怎么输出2的?

free((char *)(p+1));
printf("%d\n",*(int *)(allocp-4));
return 0;
}
//然后就是这个,
执行了free((char *)(p+1))语句就释放了空间了么,现在释放了哪些范围内的空间


这些范围内的地址在上述程序中就没用使用了么?据我对free函数的理解也最多是:传入的地址如果是在刚才声明的那个数组所占用的地址范围内的话就将p赋值给allocp指针,这说明什么,只能说明将本来指向前面那个数组开头的地址的指针现在该为了指向p+1这个地址了嘛,这样怎么就释放空间了?所以我对释放空间有点迷糊,而且释放空间是不是我前面说的那样释放了的某个空间即地址,程序就没有使用这段指针了,如果是这样,请师兄帮我理解下,这个怎么做到释放的,它释放了那段空间。星号前面的是书上东西应该没有错,后面的是一个师兄给的举例,不知道有没有错,请帮我分析下。
请各位师兄一定要帮帮忙,感激不尽!!!!!!!!!!

十八道胡同 2009-04-25
  • 打赏
  • 举报
回复
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

这个例子很眼熟。
  • 打赏
  • 举报
回复
你先把这里搞明白了先

堆和栈的区别
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
二、例子程序
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
  • 打赏
  • 举报
回复

3,怎么算开辟内存空间和释放内存空间,开辟的含义我基本上懂,但是释放时什么意思,即如果我开辟了一个内存空间其地址范围是从-50到-10我怎么将这个地址释放出来,释放出来的意思就是说这个内存空间又可以使用了么,既然都是地址为什么还要释放不直接使用,直接在里面存入你要存入的数据不就可以了么? (可不可以直接将你要赋的地址找出来赋值,如-50给这个地址赋一个长度为4的float类型的变量,有没有这种语句?)

malloc是申请堆里的数据,而堆的那些地址,不是所有的指针你都能用,只有在系统维护的可用堆里的指针,你才能用。
你malloc获得了某块地址,则可用堆里就删除该地址,所以你用完就要 free,让数据再回到可用堆,便于以后再用。



char allocbuf[ALLOCSIZE];
char * allocp=allocbuf;
char * alloc(int n)
{
if(allocp+n <=allocbuf+ALLOCSIZE)
{allocp+=n;
return(allocp-n);
}
else
return(NULL);
}
free(char *p)
{
if(p>=allocbuf&&p <=allocbuf+ALLOCSIZE)
allocp=p;
}

你这里简直是乱搞,allocbuf是栈里的数据,不需要你维护,你还去free它。晕死,没有malloc就不需要free的。
你研究了这么久,连栈里的数据都分不清?你的alloc函数是在使用栈里的指针。不知道你要干嘛。

69,377

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧