我在一些脚本语言方面相当称职,但我终于强迫自己学习原始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'\'.
您需要提供scanf
转换格式,以便它知道您想要读取字符串 - 现在,您只是显示您分配的内存中发生的任何垃圾.而不是试图描述所有问题,这里的一些代码至少应该接近工作:
char *toParseStr = malloc(10); printf("Enter a string: "); scanf("%9s", toParseStr); printf("\n%s\n", toParsestr); /* Edit, added: */ free(toParseStr); return 0;
编辑:在这种情况下,free
字符串没有任何真正的区别,但正如其他人所指出的,尽管如此,培养是一种好习惯.
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; }
第三,建议释放你分配的内存.即使这是你的整个程序,并且当程序退出时这个内存将被释放,这仍然是很好的做法.