str = (char *)malloc(0); ?

hwg119 2006-04-20 01:41:58
代码如下:
char *str;
str = (char *)malloc(0);
scanf("%s",str);

起初想的是,若输入10个字符,那分配的空间为:
str = (char *)malloc(10*sizeof(char));
可是当我输入超过10个的字符,也没有出现错误,
于是改成malloc(0)也一样,似乎可以输入任意长度字符串。

请高手指教。

...全文
579 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
庄鱼 2006-04-22
  • 打赏
  • 举报
回复
若从控制台中输入一串未知长度的字符串,
能不能动态的分配内存空间用以存放该输入字符串的指针或字符数组。
-----------------------
不能。不过可以用其它方式达到动态分配的目的
首先可以先建立一个链表结构,先申请一个比较下的内存块,以读取单个字符的方式循环的从控制态度数据直到出现结束符(通常是回车、Esc、Ctrl-Z等),再度字符同时将读取的数据填到内存块里,一旦填满就在申请一块,并将上一个的链接指针指向这个内存块。当读取结束时,再根据总的空间大小申请一个完整的空间复制过去,并将这个中间数据删除。(其实系统在处理这种大的不定长输入时通常都使用队列缓冲之类的操作,而且根本就不复制,反正读的时候会自动由上一个块无缝地过渡到下一个块,调用者根本觉察不出来)
hwg119 2006-04-22
  • 打赏
  • 举报
回复
谢谢大家解释,特别是FreeFice(庄鱼)。
LoverQiong 2006-04-22
  • 打赏
  • 举报
回复
看了大家的解释.本人感悟多多!Thanks !
  • 打赏
  • 举报
回复
用得着为这个无聊的东东讨论么?

一个字错
ehhl 2006-04-21
  • 打赏
  • 举报
回复
后面加上一句话:
free(str);
看看有没有问题?

分配的时候是不检测的,
gjianpro 2006-04-21
  • 打赏
  • 举报
回复
FreeFice(庄鱼)
正解

C语言只能是在定义时定义足够的大的空间才可以的
hwg119 2006-04-21
  • 打赏
  • 举报
回复
非常感谢各位的解答。
针对这个内存分配,我想再请教一个问题:

若从控制台中输入一串未知长度的字符串,
能不能动态的分配内存空间用以存放该输入字符串的指针或字符数组。

在vb中,有一个 ReDim Preserve a(3),
在保留原有数据的情况下,可以动态增加数组长度。C语言能做到吗?




cunsh 2006-04-20
  • 打赏
  • 举报
回复
mark
xuexi;
sms88 2006-04-20
  • 打赏
  • 举报
回复
jixingzhong(瞌睡虫:选择了远方,只顾风雨兼程!)的这句话,我翻译不来。
If size is 0, either a null pointer or a unique pointer that can be successfully passed to free() shall be returned.

FreeFice(庄鱼) ( )
是我的错,是我搞混了,查看MSDN后,我发现原来是realloc传递参数为0时才是相当于free.
Duwchy 2006-04-20
  • 打赏
  • 举报
回复
当你delete或者free时问题就出来了。
庄鱼 2006-04-20
  • 打赏
  • 举报
回复
sms88(我爱上了夏雪)
str = (char *)malloc(0);
相当于调用free(str)
----------------------------------
这种观点是错的,这就好像str = 0;就可以将指针空间释放一样的可笑(Java里有这么一种用法,只需将对象赋空值就可将资源还给系统进行垃圾回收了),在C/C++中,这将出现不确定的结果:
void *p=malloc(100);
p=malloc(0); ==> p=0; //导致100个单元孤指针的存在,而且无法回收!这与free(p)是两回事
sms88 2006-04-20
  • 打赏
  • 举报
回复
str = (char *)malloc(0);
相当于调用free(str)
bo.cui 2006-04-20
  • 打赏
  • 举报
回复
没出现任何错误,只能说明你运气好!

呵呵
庄鱼 2006-04-20
  • 打赏
  • 举报
回复
int *a = (int*)malloc(0);
a == NULL!
你分配的是一个空指针,后面的调用是不确定的。
malloc的使用方法存在问题,我记得年轻时每次写代码都要求必须是这样:
T *t = 0;
void *p = malloc(n);
if(p)
t = (T*)p;
else
exit(1);
....
if(p)
free(p);
当时觉得罗嗦,经常改成:
T *t = (T*)malloc(n);
if(0==t)
exit(1);
...
if(t)
free(t);
单项楼主那样精简的除了写很小的测试代码,否则是不敢拿出来给人用的。
LoveCreatesBeauty 2006-04-20
  • 打赏
  • 举报
回复
never never never never cast the returned type of malloc
sankt 2006-04-20
  • 打赏
  • 举报
回复
编译器并不检测缓冲区溢出
但是所有的后果由程序员承担
chenhu_doc 2006-04-20
  • 打赏
  • 举报
回复
If size is 0, either a null pointer or a unique pointer that can be successfully passed to free() shall be returned.
chenzhiyubuaa 2006-04-20
  • 打赏
  • 举报
回复
malloc向系统申请内存,系统给开辟的内存并不一定就是你申请的大小,很有可能是4k的整数倍这种类型的。往超过申请大小的地方写是很危险的事情。
jixingzhong 2006-04-20
  • 打赏
  • 举报
回复
malloc
Upon successful completion with size not equal to 0, malloc() shall return a pointer to the allocated space. If size is 0, either a null pointer or a unique pointer that can be successfully passed to free() shall be returned.
lophyxp 2006-04-20
  • 打赏
  • 举报
回复
C语言不会自动检查内存溢出这样的错误,程序员需要自己保证内存不会溢出。
这样的程序段,单独运行不会出什么问题(但在一些先进的调试环境下会提示这个错误)。但是,如果讲这段程序放到一个大的程序中,早晚要出问题。就好像你把自家的东西放到别人的房子里,早晚会出麻烦一样。
加载更多回复(2)

69,371

社区成员

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

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