关于malloc

dyfyf 2019-09-14 04:05:02
题目要求是:编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针,指向字符串开始的空间。new(n)表示分配n个字节的内存空间。 疑问:编译时显示没有错误,但是在输入字节数,按回车后,就直接出现printf里面提示语句,无法输入字符串,这是为什么呢?请问该怎么判断用malloc时内存空间是分配成功了的?
...全文
533 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
棉猴 2019-09-19
  • 打赏
  • 举报
回复
请参考《C++中getchar()的使用方法》
希望能够帮到你
dyfyf 2019-09-18
  • 打赏
  • 举报
回复
引用 20 楼 六道佩恩的回复:
[quote=引用 19 楼 qq_43898044 的回复:] [quote=引用 17 楼 六道佩恩的回复:]我感觉程序没问题,像是回车引起的,你在gets前面加个getchar试试
解决啦,谢谢谢谢呀[/quote] 是这个问题导致的吗?[/quote] 是的耶
六道佩恩 2019-09-18
  • 打赏
  • 举报
回复
引用 19 楼 qq_43898044 的回复:
[quote=引用 17 楼 六道佩恩的回复:]我感觉程序没问题,像是回车引起的,你在gets前面加个getchar试试
解决啦,谢谢谢谢呀[/quote] 是这个问题导致的吗?
dyfyf 2019-09-18
  • 打赏
  • 举报
回复
引用 17 楼 六道佩恩的回复:
我感觉程序没问题,像是回车引起的,你在gets前面加个getchar试试
解决啦,谢谢谢谢呀
dyfyf 2019-09-18
  • 打赏
  • 举报
回复
引用 13 楼 自信男孩的回复:
[quote=引用 12 楼 qq_43898044 的回复:]
[quote=引用 9 楼 自信男孩的回复:]楼主的问题是gets的问题,而不是申请空间的问题。
因为scanf输入的时候会将'\n'留在输入缓存里,而gets遇到'\n'时就直接返回,因此楼主
输入的内容并没有放到申请的空间里,因为gets遇到上次输入的'\n'直接返回了。
解决办法,在scanf后加一句getchar();吧。
或者用scanf("%s", xx);

谢谢谢谢呀。那请问是不是每次用到malloc开辟空间,用scanf输入的时候都要加这样一个语句?[/quote]
不是的,要根据具体情况。[/quote] 好的,谢谢谢谢😊😊😊😊😊
六道佩恩 2019-09-18
  • 打赏
  • 举报
回复
我感觉程序没问题,像是回车引起的,你在gets前面加个getchar试试
dyfyf 2019-09-18
  • 打赏
  • 举报
回复
引用 4 楼 gouyanfen的回复:
[quote=引用 3 楼 qq_43898044 的回复:] [quote=引用 1 楼 通信小卒的回复:]一般函数的声明放在main的外面,改一下看看是不是这块引起的
放外面了也不对,申请空间是第一问,free在第二问,所以我暂时没写free[/quote] 输入缓冲的问题,去看scanf用法你输入数字之后按了回车,scanf读入了数字,没有读取回车符,gets读取输入输出缓冲的回车,造成,直接跳过输入字符串环节了,所以你不能输入直接结束了,和分配内存没有关系[/quote] 我懂了谢谢谢谢呀
dyfyf 2019-09-18
  • 打赏
  • 举报
回复
引用 6 楼 真相重于对错的回复:
gets(str);之前加一句getchar();
谢谢谢谢呀~~
dyfyf 2019-09-18
  • 打赏
  • 举报
回复
引用 6 楼 真相重于对错的回复:
gets(str);之前加一句getchar();
谢谢谢谢呀~~
自信男孩 2019-09-18
  • 打赏
  • 举报
回复
引用 12 楼 qq_43898044 的回复:
[quote=引用 9 楼 自信男孩的回复:]楼主的问题是gets的问题,而不是申请空间的问题。
因为scanf输入的时候会将'\n'留在输入缓存里,而gets遇到'\n'时就直接返回,因此楼主
输入的内容并没有放到申请的空间里,因为gets遇到上次输入的'\n'直接返回了。
解决办法,在scanf后加一句getchar();吧。
或者用scanf("%s", xx);

谢谢谢谢呀。那请问是不是每次用到malloc开辟空间,用scanf输入的时候都要加这样一个语句?[/quote]
不是的,要根据具体情况。
dyfyf 2019-09-18
  • 打赏
  • 举报
回复
引用 9 楼 自信男孩的回复:
楼主的问题是gets的问题,而不是申请空间的问题。
因为scanf输入的时候会将'\n'留在输入缓存里,而gets遇到'\n'时就直接返回,因此楼主
输入的内容并没有放到申请的空间里,因为gets遇到上次输入的'\n'直接返回了。
解决办法,在scanf后加一句getchar();吧。
或者用scanf("%s", xx);
谢谢谢谢呀。那请问是不是每次用到malloc开辟空间,用scanf输入的时候都要加这样一个语句?
dyfyf 2019-09-18
  • 打赏
  • 举报
回复
引用 7 楼 通信小卒的回复:
#include<stdio.h>
#include<stdlib.h>

int main()
{
char *_new(int n);
int n;
char *str;
printf("请输入字节数:");
scanf("%d",&n);
str =_new(10);
while(getchar()!='\n');
printf("请输入字符串:\n");
gets(str);
printf("字符串为:\n");
puts(str);
return 0;
}
char *_new(int n)
{
char *p;
p=(char *)malloc(n*sizeof(char));
return p;
}
把你的程序专门跑了一下,应该scanf函数的存在,导致缓存区有数据,等gets函数检测缓存区的时候发现有数据就不用输入直接
跳过,while(getchar()!='\n');就是发缓存区所有的数据线读取释放清空的作用。
那请问是不是每次用malloc开辟空间,有到用scanf输入的时候都要加这个语句?
dyfyf 2019-09-18
  • 打赏
  • 举报
回复
引用 8 楼 通信小卒的回复:
如果解决了你的问题,希望采纳
谢谢谢谢你的帮助呀~虽然你说的我还没理解我才接触malloc,
自信男孩 2019-09-16
  • 打赏
  • 举报
回复
楼主的问题是gets的问题,而不是申请空间的问题。
因为scanf输入的时候会将'\n'留在输入缓存里,而gets遇到'\n'时就直接返回,因此楼主
输入的内容并没有放到申请的空间里,因为gets遇到上次输入的'\n'直接返回了。
解决办法,在scanf后加一句getchar();吧。
或者用scanf("%s", xx);
通信小卒 2019-09-14
  • 打赏
  • 举报
回复
如果解决了你的问题,希望采纳
通信小卒 2019-09-14
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>

int main()
{
char *_new(int n);
int n;
char *str;
printf("请输入字节数:");
scanf("%d",&n);
str =_new(10);
while(getchar()!='\n');
printf("请输入字符串:\n");
gets(str);
printf("字符串为:\n");
puts(str);
return 0;
}
char *_new(int n)
{
char *p;
p=(char *)malloc(n*sizeof(char));
return p;
}
把你的程序专门跑了一下,应该scanf函数的存在,导致缓存区有数据,等gets函数检测缓存区的时候发现有数据就不用输入直接
跳过,while(getchar()!='\n');就是发缓存区所有的数据线读取释放清空的作用。
真相重于对错 2019-09-14
  • 打赏
  • 举报
回复
gets(str);之前加一句getchar();
dyfyf 2019-09-14
  • 打赏
  • 举报
回复
引用 4 楼 gouyanfen的回复:
[quote=引用 3 楼 qq_43898044 的回复:] [quote=引用 1 楼 通信小卒的回复:]一般函数的声明放在main的外面,改一下看看是不是这块引起的
放外面了也不对,申请空间是第一问,free在第二问,所以我暂时没写free[/quote] 输入缓冲的问题,去看scanf用法你输入数字之后按了回车,scanf读入了数字,没有读取回车符,gets读取输入输出缓冲的回车,造成,直接跳过输入字符串环节了,所以你不能输入直接结束了,和分配内存没有关系[/quote] 那请问这种情况该怎么办呢?
gouyanfen 2019-09-14
  • 打赏
  • 举报
回复
引用 3 楼 qq_43898044 的回复:
[quote=引用 1 楼 通信小卒的回复:]一般函数的声明放在main的外面,改一下看看是不是这块引起的
放外面了也不对,申请空间是第一问,free在第二问,所以我暂时没写free[/quote] 输入缓冲的问题,去看scanf用法你输入数字之后按了回车,scanf读入了数字,没有读取回车符,gets读取输入输出缓冲的回车,造成,直接跳过输入字符串环节了,所以你不能输入直接结束了,和分配内存没有关系
dyfyf 2019-09-14
  • 打赏
  • 举报
回复
引用 1 楼 通信小卒的回复:
一般函数的声明放在main的外面,改一下看看是不是这块引起的
放外面了也不对,申请空间是第一问,free在第二问,所以我暂时没写free
加载更多回复(2)

69,371

社区成员

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

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