【问题标题】:Why exactly malloc is used? [duplicate]为什么要使用 malloc? [复制]
【发布时间】:2013-09-18 14:58:12
【问题描述】:

我一直试图了解什么是 malloc() 以及为什么要使用它。我知道 malloc 用于动态分配内存,如果您不知道要创建多少内存,则需要它。我一直在做一些动手操作。

下面的代码声明了一个字符指针数组,第一个字符指针用“hello”初始化。这很好用。

int main()
{


char *strarray[5];
strarray[0]="hello";
printf("%s\n",strarray[0]);
return 0;
}

但是,如果我尝试使用 strcpy() 函数将“hello”字符串复制到 strarray[0](没有 malloc()),就会出现问题。它进入一些循环并且不复制字符串。如果我使用 malloc 分配内存,它工作正常。

int main()
{

char *strarray[5];
//strarray[0]=(char *)malloc(sizeof(char)*10);
strcpy(strarray[0],"hello");
printf("%s\n",strarray[0]);
return 0;
}

我想知道有什么不同?如果我可以将“hello”初始化为不使用 malloc 的 char 指针,为什么我不能用 strcpy() 做同样的事情。

【问题讨论】:

  • 您在磁盘上有一个文本文件,其中包含您需要的字符串数组中的数据。每个字符串一个单词。完成后,您的数组应包含 N 个字符串,其中 N 是文件中的字数...并且它必须适用于 any 大小的文件。想想你如何用固定长度的数组编写代码,然后问问自己内存分配函数malloc()有什么用处。

标签: c malloc strcpy


【解决方案1】:
char *strarray[5];

将分配五个指向字符的指针数组(可以解释为字符串)。

这个不会分配的是存放这五个字符串的内存空间。所以,如果你想让所有的指针指向不同的字符串,你需要自己分配它们。

但是,由于这些是指针,因此如果您不想分配任何东西,您实际上并不需要分配任何东西。这就是您的第一个示例有效的原因。 strarray[0]="hello"; 将使数组的第一个元素指向存储 "hello" 字符串文字的位置(编译器会将此文字放在内存中的某个位置,因此您的指针将指向有效的内存位置)。

总而言之,在第一个示例中,您的指针指向已分配并使用 "hello" 初始化的内存(编译器为您完成了此操作)-您没有复制字符串,您只是将值分配给指针。在第二个示例中,您的指针指向某个未定义的位置,您没有明确保留该位置,但您正在尝试写入它。

【讨论】:

  • 抱歉,由于使用了五个指针的数组而造成的误导。这个问题甚至适用于一个字符指针。我实际上只使用一个指针。我想将一些字符串复制到此字符指针,该字符指针未使用 malloc 分配内存。如果我可以通过初始化(不使用 malloc)来做到这一点,那么为什么我不能使用 strcpy 而不使用 malloc() 是我的问题。
  • @Ravindra 实际上,您可以忽略答案中的数组,因为它集中在单个指针上。我已经添加了应该有意义的最后一段。
  • 这就是我感到困惑的地方。指向一些已经分配的内存,并复制到一些指向未定义位置的指针!现在我不太清楚发生了什么。谢谢:)
【解决方案2】:

这是错误的:char *strarray[5]; 这是堆栈分配 5 个 char* 指针。我想你想写char strarray[6],它会在堆栈上创建 6 个字符。这可以容纳“hello”及其隐含的 NULL 终止符(NULL 终止符告诉 C 函数一个字符串已经结束)。

写完char strarray[6];strcpy(strarray, "hello"); 是安全的。然后你可以调用:

printf("%s\n",strarray);

我删除了 [0] 的地方:%s 需要 char* 而不是 charstrarray[0]char 类型。

您使用malloc上分配内存。我可以建议您阅读 Kernighan 和 Ritchie(C 编程语言)以了解更多详细信息吗?

【讨论】:

  • 忘记字符指针数组。假设我只有一个字符指针,如下所示。字符 *strarray; /*strarray[0]=(char *)malloc(sizeof(char)*10);*/ strcpy(strarray,"hello"); printf("%s\n",strarray);还是不行
  • @Ravindra;我不知道在哪里结束 // !但作为一个初学者,从你的 printf 中删除 [0] 因为 %s 需要一个 char* 而不是一个 char。请参阅我的答案中的额外文字。
  • 改变了它。现在你可以得到。该评论只是为了显示我使用 malloc() 的“if”和“if not”的区别。
  • Kernighan 和 ritchie,当然!谢谢。
  • @Ravinda 快乐;阅读第一章,做练习,我期待着阅读你的答案!
【解决方案3】:

malloc():分配一块大小字节的内存,返回一个指向块开头的指针。

void* malloc (size_t size);  

size_tunsigned int 类型。

如果您不知道要创建多少内存,则需要它,这是不正确的。
你应该知道最少需要多少内存。

在 malloc() 的帮助下,您可以在 run time 而不是 compile time. 分配内存

strarray[0]="hello";   
//here you need not to allocate memory as this is an assignment 

strcpy() 中使用指针作为destination string 之前需要分配一些空间

strcpy() 将 source 指向的 C 字符串复制到目标指向的数组中,包括终止空字符(并在该点停止)。

destination 指向的数组的大小应足够长,以包含与 source 相同的 C 字符串(包括终止的空字符),并且不应在内存中与 source 重叠。

为此,您需要allocate Memory first

strcpy 本身不会为目标字符串分配内存

【讨论】:

  • 我的意思是“你不知道要在编译时创建多少内存”
  • @Ravindra 请尝试理解这一点。您应该知道有多少内存足以容纳受人尊敬的内容。基于此,您可以分配内存。可以是静态的(编译时)或者动态(运行时)。 malloc 的主要目的是当您不需要那么多大小的成员时。对于静态分配,您不能增加或减少大小,但您可以使用动态分配。
猜你喜欢
  • 2021-01-24
  • 2013-12-04
  • 2017-08-09
  • 2012-09-12
  • 1970-01-01
  • 2020-05-12
  • 2019-09-10
  • 1970-01-01
相关资源
最近更新 更多