【问题标题】:Typedef char pointer allocation of string字符串的typedef char指针分配
【发布时间】:2021-04-15 04:36:35
【问题描述】:

我试图理解具有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 *str);(此方法适用于任何类型)

标签: c string pointers malloc dynamic-memory-allocation


【解决方案1】:

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

在编译时已知的东西可以存在于堆栈中,而在编译时你不知道的东西可以存在于堆中并通过调用malloc、@进行分配、重新分配、释放等987654325@和free

这基本上都归结为分配的内存大小。例如,如果您声明一个 int,则该 int 可以在您的程序执行时更改值,因为它始终存在于 sizeof an int 的空间中。

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

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

sizeof 的情况下,嗯,它告诉malloc 你想要分配多少,在这种情况下是char,但它可以是任何可以解析为大小的东西 ,例如您定义的结构等。因此,当您致电malloc 时,您的基本意思是“给我这么大的东西,给我这么多”。在这种情况下,“给我一个 char 一样大的东西”,然后给我“strlen(str) + 1 of them”。

而且因为字符的大小始终为 1 字节,并且 strlen 返回一个 size_t 类型的值,malloc 采用该值,您可以简单地使用 char *ptr = malloc(strlen(str) + 1)。但请记住,malloc 返回一个 void 类型的指针,因此您需要将其转换为您请求的类型。在这种情况下,您可以将其转换为 char*,如下所示:ptr = (char*)malloc(strlen(str) + 1)

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

【讨论】:

    【解决方案2】:

    在下面的代码中你分配了太多的内存:

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

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

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

    您需要:

    char* res = malloc(strlen(str) + 1);
    if (res != NULL)
    {
        strcpy(res, str);
    }
    return res;
    

    【讨论】:

    • 这么说吧:这个网站比你的编译器更宽容很多
    猜你喜欢
    • 2017-01-18
    • 1970-01-01
    • 2022-10-09
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多