字符串的typedef char指针分配

Typedef char pointer allocation of string

我正在尝试理解具有 typedef char * 我应该为字符串 "Pointer of""Redundancy".

分配足够内存的代码
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>

typedef char* DString;
DString dstring_initialize(const char* str);

int main(void)
{
    DString str1, str2;
    str1 = dstring_initialize("Pointer of ");
    str2 = dstring_initialize("Redundancy ");
return 0;
}

DString dstring_initialize(const char* str)
{
  str = malloc((strlen(str)+1)*sizeof(DString));//mycode 
  return str;//mycode
}

我 100% 确定我做的完全错了。我唯一应该做的就是更改它说 mycode 的部分。就是这样发给我的,不过我之前说过,我不知道它是如何工作的,如果有人能详细解释给我,我将不胜感激

在下面的代码中,您分配了过多的内存:

str = malloc((strlen(str)+1)*sizeof(DString));//mycode 
                             ^^^^^^^^^^^^^^
                             Not needed

您还将 malloc 中的 return 值分配给输入参数,即您“销毁”了输入。

此外,您永远不会将输入字符串的值复制到分配的内存中。

您需要:

而不是上述内容
char* res = malloc(strlen(str) + 1);
if (res != NULL)
{
    strcpy(res, str);
}
return res;

内存有两个区域,本地事物存在的栈,以及其他事物存在的堆。堆栈是自动的,因为您的编译器会为您管理它,而堆是您必须通过调用 mallocreallocfree 等来管理的东西

编译时已知的东西可以存在于堆栈中,而编译时不知道的东西可以存在于堆中并通过调用 mallocreallocfree.

而这基本上都归结为分配的内存大小。例如,如果您声明一个 int,则该 int 的值可以在您的程序执行时发生变化,因为它始终存在于 space 中,即 sizeof 一个 int.

但是如果您的字符串在程序运行时改变了长度并且您不想分配足够大的东西以始终能够容纳它,您可能希望将其放入堆中。例如,如果您总是使用 char str[64] 之类的东西使其足够大,则不需要在堆上为 str 分配 space 或类似的东西,因为您分配了 space提前。

malloc方面,你要求它分配一定大小的内存,如果可以它returns一个指向它的指针,如果它不能returns NULL。所以保存malloc返回的指针的变量存在于栈中,而malloc分配的内存存在于堆中,不是自动的。即:当你的程序终止时,堆栈中的指针变量被释放,而不是存储在堆中的实际内存,所以你必须用 free.

释放它

sizeof 的情况下,好吧,它告诉 malloc 你想要分配多少,在本例中是 char,但它可以是 任何东西 可以解析为一个大小,例如您定义的结构等。所以当您调用 malloc 时,您基本上是在说“给我这么大的东西,给我这么多” .在这种情况下,“给我一个 char 一样大的东西”并给我“strlen(str) + 1 个”。

并且因为字符的大小始终为 1 个字节,并且 strlen returns 类型为 size_t 的值,malloc 接受您可以简单地将其作为 char *ptr = malloc(strlen(str) + 1)。但请记住 malloc returns 类型的指针 void 因此您需要将其转换为您请求的类型。在这种情况下,您可以像这样将其转换为 char*ptr = (char*)malloc(strlen(str) + 1).

另一个错误在另一个答案中描述。但这基本上概括了 malloc 的工作原理。我不是老师,如果我不是 100% 清楚,我深表歉意。