【问题标题】:Dynamic memory allocation after scanfscanf 后的动态内存分配
【发布时间】:2016-05-09 09:22:24
【问题描述】:

是否可以在使用 scanf 读取的字符串中进行动态内存分配,而无需先将其声明为数组?

【问题讨论】:

  • 是的。分配它并将指针传递给fscanf。然而fscanf 仍然不安全。
  • 没错,我的意思是scanf!
  • scanf 在大多数实现上只是对vfscanf(stdin, ...) 的调用所以适用于一个,适用于另一个。

标签: c malloc dynamic-allocation


【解决方案1】:

不可能为string 动态分配内存使用scanf 读取它之后,因为scanf 需要一个指针。这意味着您必须首先分配内存,以便将其作为参数提供给scanf

你可以像下面的例子那样做:

char *str;
str = malloc(X*sizeof(char)); //where x is the number of characters you want to allocate
if (str != NULL)
    int result = scanf("%s", str);

换句话说,将分配的指针传递给scanf

注意:你应该小心你提供的输入,因为如果你提供一个大于分配空间的字符串,你可能会导致

【讨论】:

  • 没错,我的意思是scanf!
  • @StamatisPapadopoulos 你能澄清你的评论吗?我不明白我是否覆盖了你。
  • @KarstenKoop,以及如何使用ulimit 限制每个用户的可用内存量?为了便于携带,请始终检查malloc的结果
  • 让程序崩溃?没有诊断?没有日志?没有?不,谢谢。
  • @StamatisPapadopoulos,没有 malloc not 初始化为零,请参阅 here。你把它和realloc混淆了吗?此外,请注意您在一个国际站点,编程的顶部,因此 cmets 完全用希腊语编写,这不是一个好方法。 Ευχαριστώ! :)
【解决方案2】:

从您的问题来看,您似乎想为字符串 被扫描后分配内存。不幸的是,您无法执行此操作,因为 scanf 函数需要放置内存地址它扫描的数据。你能做的最好的就是:

char *someInput = malloc(sizeof(char) * 80);
scanf("%s", someInput);

编辑:注意 80 是一个任意数量,这表示我们为字符串分配了多少个字符来保存 - 选择 80 作为命令提示符中行的通常长度。

【讨论】:

  • 你的意思是如果我不使用数组,那么 scanf 不知道把数据放在哪里?
  • @StamatisPapadopoulos 准确地说,您需要将数据扫描到内存中的某个位置,对吗?声明只是意味着“我有这种类型的变量”,直到你为它分配内存它只是一个名字。这里的答案很重要,你也理解了c中数组和指针之间的关系。
  • 如果声明了一个指针,那么我没有合适的内存量,对吧?
  • @StamatisPapadopoulos 事实并非如此。指针可以指向您为其分配的内存,例如在我的回答中,指针指向 80 个字符的内存。指针和数组在 c 中非常相似,在很多情况下它们可以互换使用。可以将数组视为(并使用)为指针,每个连续元素都在第一个元素之后。这是 c 中的一个关键主题,重要的是你去阅读它 - 我不会公正地在 cmets 中解释它。也不要忘记接受您认为最有帮助的答案。
  • @StamatisPapadopoulos 很高兴我能提供帮助,在堆栈溢出时您只能接受一个答案,而且您应该为您认为有帮助的答案投票!
猜你喜欢
  • 2020-04-21
  • 2012-08-09
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2011-07-07
  • 2012-01-13
  • 1970-01-01
  • 2021-02-15
相关资源
最近更新 更多