我在一些脚本语言方面相当有能力,但我终于强迫自己学习原始C语言,我只是在玩一些基本的东西(I/O现在)。如何分配堆内存,在分配的内存中存储一个字符串,然后再将其吐出?这就是我现在所拥有的,我怎样才能让它正常工作呢?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char *toParseStr = (char*)malloc(10);
scanf("Enter a string",&toParseStr);
printf("%s",toParseStr);
return 0;
}
目前,我得到了奇怪的输出,如“8”。
最佳答案
char *toParseStr = (char*)malloc(10);
printf("Enter string here: ");
scanf("%s",toParseStr);
printf("%s",toParseStr);
free(toParseStr);
首先,
scanf
中的字符串指定要接收的输入。要在接受键盘输入之前显示字符串,请使用printf
,如图所示。其次,您不需要取消引用
toParseStr
,因为它指向您使用malloc
分配的大小为10的字符数组。如果使用的函数将指向另一个内存位置,则需要&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;
}
第三,建议释放您分配的内存。即使这是你的整个程序,并且当程序退出时,这个内存将被释放,这仍然是一个好的实践。