如何动态malloc申请内存空间?

亚细亚 2009-11-02 11:06:19
要获得一个动态字符串,不知道如何用malloc动态申请空间?
...全文
904 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 gkke1983 的回复:]
c语言中要么知道分配大小,要么重新分配;
c++中的容器可以解决你的问题,参看C++ Primer 3rd.
[/Quote]
补充一下:容器也就是把重新分配的操作封装了,重新分配这个过程还是少不了的。
gkke1983 2009-11-03
  • 打赏
  • 举报
回复
c语言中要么知道分配大小,要么重新分配;
c++中的容器可以解决你的问题,参看C++ Primer 3rd.
bomeng_21it 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 thefirstz 的回复:]
char *p = (char *)malloc(strlen(str) + 1);
...
free(p);
[/Quote]

记得最后还得:
p=NULL;
hewanli0420 2009-11-03
  • 打赏
  • 举报
回复
这是关于malloc的详解
malloc  原型:extern void *malloc(unsigned int num_bytes);
  用法:#include <malloc.h>
  或#include<stdlib.h>
  功能:用于向内存申请空间,分配长度为num_bytes字节的内存块
  说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
  当内存不再使用时,应使用free()函数将内存块释放。
  调用格式,
  指针名=(指针所指对象的数据类型*)malloc(个数*sizeof(指针所指对象的数据类型)),其对应例子如下:
  int *p = (int *) malloc ( n* sizeof(int) );
  举例:
  // malloc.c
  #include <syslib.h>
  #include <malloc.h>
  main()
  {
  char *p;
  clrscr(); // clear screen
  p=(char *)malloc(100);
  if(p)
  printf("Memory Allocated at: %x",p);
  else
  printf("Not Enough Memory!\n");
  
  if(p)
  free(p);
  getchar();
  return 0;
  }
  

  
Zijian_Zhang 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yaxiya 的回复:]
引用 9 楼 tadican 的回复:
引用 6 楼 yaxiya 的回复:
如果字符串长度大于1000,而实际只申请了1000,回出现什么问题吗?

运气不好的话,你可能会把不属于你的部分空间覆盖掉,会破坏堆的结构,系统会强迫你的程序退出。

怎么才能既不浪费空间,又能够存放下动态字符串?
[/Quote]

看10楼。
cutestar 2009-11-03
  • 打赏
  • 举报
回复
使用malloc后要检查返回的指针是不是为NULL
char *p = (char*)malloc(1000);
if(p == NULL){ //如果分配过大,系统找不到这么大的内存或是其它原因
// 内存分配错误处理
}
memset(p, NULL, 1000); // 有的编译器在malloc后会初始化为NULL

最后要释放
free(p); p = NULL;
p在使用过程中,最好不要修改其地址.如在遍历时:
for(; p != '\0' ; p++){...}
应该用另外一个指针来遍历:
for(char *pa = p; pa != '\0'; pa++){...}
如:
char *pa = p;
for(; p != '\0'; p++){...}
free(pa);
这样容易引起混乱..

亚细亚 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tadican 的回复:]
引用 6 楼 yaxiya 的回复:
如果字符串长度大于1000,而实际只申请了1000,回出现什么问题吗?

运气不好的话,你可能会把不属于你的部分空间覆盖掉,会破坏堆的结构,系统会强迫你的程序退出。
[/Quote]
怎么才能既不浪费空间,又能够存放下动态字符串?
HelloCChao 2009-11-02
  • 打赏
  • 举报
回复
那种使用动态链表吧,一个字母一个字母地挂到链表上,不管字符串有多长,一个字母申请一个节点的内存。
直到最后你机器的内存用完了。。。
TADICAN 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yaxiya 的回复:]
如果字符串长度大于1000,而实际只申请了1000,回出现什么问题吗?
[/Quote]
运气不好的话,你可能会把不属于你的部分空间覆盖掉,会破坏堆的结构,系统会强迫你的程序退出。
norahsmile 2009-11-02
  • 打赏
  • 举报
回复
先malloc一段空间。然后再使用realloc,函数原型:void *realloc(void *block, size_t size)给一个已分配的指针block重新内存,大小为size,返回重新分配的内存指针,NULL-分配失败。
ArmStronger 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yaxiya 的回复:]
如果字符串长度大于1000,而实际只申请了1000,回出现什么问题吗?
[/Quote]
那是肯定出问题啦,超出的内存不能访问
亚细亚 2009-11-02
  • 打赏
  • 举报
回复
如果字符串长度大于1000,而实际只申请了1000,回出现什么问题吗?
昵称很不好取 2009-11-02
  • 打赏
  • 举报
回复
char *p = (char *)malloc(strlen(str) + 1);
...
free(p);
Caballeroo 2009-11-02
  • 打赏
  • 举报
回复
记得最后free()以免造成内存泄露!
ArmStronger 2009-11-02
  • 打赏
  • 举报
回复
申请100个空间
char *p = (char*)malloc(sizeof(char)*100);
pengzhixi 2009-11-02
  • 打赏
  • 举报
回复
看1L
  • 打赏
  • 举报
回复
char* p = (char*)malloc( 1000 );
zishan169 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cfz379945430 的回复:]
引用 6 楼 yaxiya 的回复:
如果字符串长度大于1000,而实际只申请了1000,回出现什么问题吗?

那是肯定出问题啦,超出的内存不能访问

[/Quote]

超出的一般情况下还是可以访问的,只是把别人家的空间占用了,横行霸道了
selooloo 2009-11-02
  • 打赏
  • 举报
回复
定义个字符指针,char *p;
用strlen()或sizeof()计算字符串大小,比如是N;
分配空间p=(char *)malloc(N*sizeof(char));
用完把p空间释放free(p);
用的时候再申请
leopardaa521 2009-11-02
  • 打赏
  • 举报
回复
free(p)是释放的p指向的空间而不是释放的p
所以最后再令p=NULL;
加载更多回复(6)

69,335

社区成员

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

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