我在一些脚本语言方面相当有能力,但我终于强迫自己学习原始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;
}

第三,建议释放您分配的内存。即使这是你的整个程序,并且当程序退出时,这个内存将被释放,这仍然是一个好的实践。

08-19 17:55