当前位置:  开发笔记 > 小程序 > 正文

Malloc和scanf

如何解决《Malloc和scanf》经验,为你挑选了2个好方法。

我在一些脚本语言方面相当称职,但我终于强迫自己学习原始C.我只是在玩一些基本的东西(I/O现在).如何分配堆内存,将字符串存储在已分配的内存中,然后将其吐出来?这就是我现在所拥有的,我怎样才能让它正常工作?

#include 
#include 

int main(int argc, char *argv[])
{
  char *toParseStr = (char*)malloc(10);
  scanf("Enter a string",&toParseStr);
  printf("%s",toParseStr);
  return 0;
}

目前我得到的奇怪的输出就像'8'\'.



1> Jerry Coffin..:

您需要提供scanf转换格式,以便它知道您想要读取字符串 - 现在,您只是显示您分配的内存中发生的任何垃圾.而不是试图描述所有问题,这里的一些代码至少应该接近工作:

char *toParseStr = malloc(10);
printf("Enter a string: ");
scanf("%9s", toParseStr);
printf("\n%s\n", toParsestr);
/* Edit, added: */ 
free(toParseStr);
return 0;

编辑:在这种情况下,free字符串没有任何真正的区别,但正如其他人所指出的,尽管如此,培养一种好习惯.



2> Jacob..:
  char *toParseStr = (char*)malloc(10);
  printf("Enter string here: ");
  scanf("%s",toParseStr);
  printf("%s",toParseStr);
  free(toParseStr);

首先,字符串in scanf指定它将要接收的输入.要在接受键盘输入之前显示字符串,请使用printf如图所示.

其次,您不需要取消引用,toParseStr因为它指向了您分配的大小为10的字符数组malloc.如果您使用的功能会将其指向另一个内存位置, &toParseStr需要.

例如,假设您要编写一个函数来分配内存.那么你需要&toParseStr因为你正在改变指针变量的内容(这是内存中的一个地址---你可以通过打印它的内容来亲眼看到).

void AllocateString(char ** ptr_string, const int n)
{
    *ptr_string = (char*)malloc(sizeof(char) * n);
}

正如您所看到的,它接受char ** ptr_string哪个读取作为指针存储指针的内存位置,该指针存储malloc分配的n字节块的第一个字节的内存地址(在操作之后)(现在它具有一些垃圾内存地址)因为它是未初始化的).

int main(int argc, char *argv[])
{
  char *toParseStr;
  const int n = 10;
  printf("Garbage: %p\n",toParseStr);
  AllocateString(&toParseStr,n);
  printf("Address of the first element of a contiguous array of %d bytes: %p\n",n,toParseStr);

  printf("Enter string here: ");
  scanf("%s",toParseStr);
  printf("%s\n",toParseStr);
  free(toParseStr);

  return 0;
}

第三,建议释放你分配的内存.即使这是你的整个程序,并且当程序退出时这个内存将被释放,这仍然是很好的做法.


即使在一个小程序中也可以释放+1.让我想起"小水滴造海洋".;-)
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有