user-0 提问: 如何写一个函数，开辟内存，并返回首地址；

回复:
user: user-1
content: malloc最终也是调用了windows的 分配堆的函数的，如何你自己实现也是调用平台API在自己管理，所以没意义的

user: user-0
content: 引用 28 楼 lin5161678 的回复:[quote=引用 27 楼 hwx342840456 的回复:] [quote=引用 21 楼 lin5161678 的回复:] [quote=引用 20 楼 u013163178 的回复:] [quote=引用 10 楼 hwx342840456 的回复:] [quote=引用 8 楼 u013163178 的回复:]  void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。[/quote]你为什么不编译呢，你知道只要你的编译器不太老，他就能编译通过，还能运行呢,如果不知道为什么，请百度c99变长数组 #include <stdio.h>  int main(void) { 	// your code goes here 	int n; 	scanf("%d",&n); 	char a[n]; 	scanf("%s",a); 	printf("%s\n",a); 	return 0; } /* Input: 20 helloworld  Output: helloworld */[/quote]你才应该去百度 变长数组  变长数组定义有限制 不是你随便写写就出来的  static 不能做变长数组[/quote]   我用的VC++ 6.0。编译无法通过。[/quote] 1 你回复错人了  2 别用 VC6.0[/quote]  不用VC6.0那用什么？求推荐哎？VC6.0是无法编译通过可变长数组的

user: user-2
content: 引用 27 楼 hwx342840456 的回复:[quote=引用 21 楼 lin5161678 的回复:] [quote=引用 20 楼 u013163178 的回复:] [quote=引用 10 楼 hwx342840456 的回复:] [quote=引用 8 楼 u013163178 的回复:]  void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。[/quote]你为什么不编译呢，你知道只要你的编译器不太老，他就能编译通过，还能运行呢,如果不知道为什么，请百度c99变长数组 #include <stdio.h>  int main(void) { 	// your code goes here 	int n; 	scanf("%d",&n); 	char a[n]; 	scanf("%s",a); 	printf("%s\n",a); 	return 0; } /* Input: 20 helloworld  Output: helloworld */[/quote]你才应该去百度 变长数组  变长数组定义有限制 不是你随便写写就出来的  static 不能做变长数组[/quote]   我用的VC++ 6.0。编译无法通过。[/quote] 1 你回复错人了  2 别用 VC6.0

user: user-0
content: 引用 21 楼 lin5161678 的回复:[quote=引用 20 楼 u013163178 的回复:] [quote=引用 10 楼 hwx342840456 的回复:] [quote=引用 8 楼 u013163178 的回复:]  void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。[/quote]你为什么不编译呢，你知道只要你的编译器不太老，他就能编译通过，还能运行呢,如果不知道为什么，请百度c99变长数组 #include <stdio.h>  int main(void) { 	// your code goes here 	int n; 	scanf("%d",&n); 	char a[n]; 	scanf("%s",a); 	printf("%s\n",a); 	return 0; } /* Input: 20 helloworld  Output: helloworld */[/quote]你才应该去百度 变长数组  变长数组定义有限制 不是你随便写写就出来的  static 不能做变长数组[/quote]   我用的VC++ 6.0。编译无法通过。

user: user-3
content: malloc,realloc,free

user: user-4
content: 引用 21 楼 lin5161678 的回复:[quote=引用 20 楼 u013163178 的回复:] [quote=引用 10 楼 hwx342840456 的回复:] [quote=引用 8 楼 u013163178 的回复:]  void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。[/quote]你为什么不编译呢，你知道只要你的编译器不太老，他就能编译通过，还能运行呢,如果不知道为什么，请百度c99变长数组 #include <stdio.h>  int main(void) { 	// your code goes here 	int n; 	scanf("%d",&n); 	char a[n]; 	scanf("%s",a); 	printf("%s\n",a); 	return 0; } /* Input: 20 helloworld  Output: helloworld */[/quote]你才应该去百度 变长数组  变长数组定义有限制 不是你随便写写就出来的  static 不能做变长数组[/quote] 学习了

user: user-5
content: 引用 19 楼 liu_lakers 的回复:出这种题的都是变态吗？？ 什么情况下会用到你自己去写这种函数？  真尼玛恶心。很多人学编程都钻牛角尖，殊不知，真正工作中基本都是用最朴实无华的代码。工作中越是高手，写的代码越朴实。还是用得到的，比如在管理共享内存的时候，就可以按照堆的方式先申请一大片连续的内存然后来分配

user: user-6
content: 这一定是老谭干的，我被他坑过 于是我就用了VirtualAlloc……

user: user-2
content: 引用 20 楼 u013163178 的回复:[quote=引用 10 楼 hwx342840456 的回复:] [quote=引用 8 楼 u013163178 的回复:]  void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。[/quote]你为什么不编译呢，你知道只要你的编译器不太老，他就能编译通过，还能运行呢,如果不知道为什么，请百度c99变长数组 #include <stdio.h>  int main(void) { 	// your code goes here 	int n; 	scanf("%d",&n); 	char a[n]; 	scanf("%s",a); 	printf("%s\n",a); 	return 0; } /* Input: 20 helloworld  Output: helloworld */[/quote]你才应该去百度 变长数组  变长数组定义有限制 不是你随便写写就出来的  static 不能做变长数组

user: user-4
content: 引用 10 楼 hwx342840456 的回复:[quote=引用 8 楼 u013163178 的回复:]  void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。[/quote]你为什么不编译呢，你知道只要你的编译器不太老，他就能编译通过，还能运行呢,如果不知道为什么，请百度c99变长数组 #include <stdio.h>  int main(void) { 	// your code goes here 	int n; 	scanf("%d",&n); 	char a[n]; 	scanf("%s",a); 	printf("%s\n",a); 	return 0; } /* Input: 20 helloworld  Output: helloworld */

user: user-7
content: 出这种题的都是变态吗？？ 什么情况下会用到你自己去写这种函数？  真尼玛恶心。很多人学编程都钻牛角尖，殊不知，真正工作中基本都是用最朴实无华的代码。工作中越是高手，写的代码越朴实。

user: user-2
content: 引用 13 楼 liulianglin 的回复:[quote=引用 9 楼 hwx342840456 的回复:] [quote=引用 7 楼 liulianglin 的回复:] [quote=引用 4 楼 hwx342840456 的回复:] [quote=引用 3 楼 liulianglin 的回复:] ”动态的控制字符数组的长度“   是几个意思   字符数组的长度是通过你自己传进去的参数来控制的，最后你只是返回一个指向n个字符的指针而已。。。  你传个代码上来看看行不行？如何开辟一段连续的n个字节的内存。另外，字符数组的长度如何通过我穿进去的参数来控制？[/quote]  static void *buf = 0x10000000; static int pos = 0; void *alloc(int n) {     if ( (pos + n) >1000 )      {         return NULL;     }     else     {         pos += n;         return  (buf + pos - n);     } } free(void *p) {     pos -= (p - buf); }[/quote]  我看明白了，你这个是最先就指定好了再某个地址开始开辟空间，但是这样有风险啊，假设这个地址里面是有数据的，岂不是就破坏了？[/quote]     malloc函数的实质体现在它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时，它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后，将该内存块一分为二（一块的大小与用户请求的大小相等，另一块的大小就是剩下的字节）。接下来，将分配给用户的那块内存传给用户，并将剩下的那块（如果有的话）返回到连接表上。[/quote]你对 malloc 的解释是对的 但是和你的错误 毫无关系  你的做法会破坏程序堆栈 依然是错的

user: user-2
content: 引用 8 楼 u013163178 的回复: void * f(int n) { static char a[n]; return a; } 这是错的  VLA 不可以是 static 或者 全局

user: user-2
content: 难度毛线  标准C做不到  平台相关而已

user: user-5
content: mmap应该可以

user: user-8
content: 直接看malloc函数原型。。。 http://blog.csdn.net/hzhzh007/article/details/6424638

user: user-9
content: 引用 9 楼 hwx342840456 的回复:[quote=引用 7 楼 liulianglin 的回复:] [quote=引用 4 楼 hwx342840456 的回复:] [quote=引用 3 楼 liulianglin 的回复:] ”动态的控制字符数组的长度“   是几个意思   字符数组的长度是通过你自己传进去的参数来控制的，最后你只是返回一个指向n个字符的指针而已。。。  你传个代码上来看看行不行？如何开辟一段连续的n个字节的内存。另外，字符数组的长度如何通过我穿进去的参数来控制？[/quote]  static void *buf = 0x10000000; static int pos = 0; void *alloc(int n) {     if ( (pos + n) >1000 )      {         return NULL;     }     else     {         pos += n;         return  (buf + pos - n);     } } free(void *p) {     pos -= (p - buf); }[/quote]  我看明白了，你这个是最先就指定好了再某个地址开始开辟空间，但是这样有风险啊，假设这个地址里面是有数据的，岂不是就破坏了？[/quote]     malloc函数的实质体现在它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时，它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后，将该内存块一分为二（一块的大小与用户请求的大小相等，另一块的大小就是剩下的字节）。接下来，将分配给用户的那块内存传给用户，并将剩下的那块（如果有的话）返回到连接表上。

user: user-0
content: 引用 7 楼 liulianglin 的回复:[quote=引用 4 楼 hwx342840456 的回复:] [quote=引用 3 楼 liulianglin 的回复:] ”动态的控制字符数组的长度“   是几个意思   字符数组的长度是通过你自己传进去的参数来控制的，最后你只是返回一个指向n个字符的指针而已。。。  你传个代码上来看看行不行？如何开辟一段连续的n个字节的内存。另外，字符数组的长度如何通过我穿进去的参数来控制？[/quote]  static void *buf = 0x10000000; static int pos = 0; void *alloc(int n) {     if ( (pos + n) >1000 )      {         return NULL;     }     else     {         pos += n;         return  (buf + pos - n);     } } free(void *p) {     pos -= (p - buf); }[/quote]   1、return(buf + pos -n);和return buf没区别吧，为何用前者？ 2、以及指定了内存起始地址，直接让char *p=buf；然后P++就可以访问后面的字节了，alloc函数里面的操作感觉没有意义。

user: user-9
content: malloc    free的内部实现远不像想象的那么简单---”只是简单的分配一段内存“，感兴趣的话可以看一看malloc 源码  http://blog.csdn.net/zdl1016/article/details/8696514  人家写的挺仔细。。。

user: user-0
content: 引用 8 楼 u013163178 的回复: void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。