C 扫描后的动态内存分配

C 扫描后的动态内存分配,c,malloc,dynamic-allocation,buffer-overflow,C,Malloc,Dynamic Allocation,Buffer Overflow,是否可以在使用scanf读取的字符串中动态分配内存,而不首先将其声明为数组?在使用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

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

在使用
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
函数需要内存地址来放入它扫描的数据。您最多只能做到以下几点:

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

编辑:请注意,80是一个任意数量,这表示我们为字符串分配的字符数-80是在命令提示符中选择的,因为它是一行的通常长度。

是。分配它并将指针传递到
fscanf
。然而,
fscanf
仍然不安全。确切地说,我是说scanf<代码>扫描
在大多数实现中只是调用
vfscanf(stdin,…)
所以适用于一个的,适用于另一个。确切地说,我指的是扫描@你能澄清一下你的评论吗?我不明白我是否涵盖了您。@KarstenKoop,那么如何限制每个用户的可用内存量呢?为了便于携带,请始终检查
malloc的结果
让程序崩溃?没有诊断?没有日志?没有什么?不,谢谢。@StamatisPapadopoulos,不malloc不初始化为零,请参阅。你把它和你的名字混淆了吗?此外,请注意,你是在一个国际网站,顶部的编程,因此评论完全写在希腊语,是不是一个好办法。Ευχαριστώ! :)你的意思是如果我不使用数组,那么scanf就不知道把数据放在哪里?@StamatisPapadopoulos确切地说,你需要把数据扫描到内存中的某个地方,对吗?声明只是意味着“我有这个类型的变量”,直到您为它分配内存为止,它只是一个名称。这里的答案很重要,你还需要理解c中数组和指针之间的关系。如果a声明了一个指针,那么我没有足够的内存,对吗?@StamatisPapadopoulos事实并非如此。一个指针可以指向你为它分配的内存。例如,在我的回答中,指针指向80个字符的内存。指针和数组在c语言中非常相似,在很多情况下它们可以互换使用。数组可以被看作(并被使用)指针,每个连续的元素都紧跟在第一个元素之后。在c语言中,这是一个非常重要的话题,重要的是你去读一读——我不会公正地在评论中解释它。也别忘了接受你认为最有用的答案。@StamatisPapadopoulos很高兴我能帮上忙,在堆栈溢出时,你只能接受一个答案,而且你应该投票选出你认为有用的答案!