你怎么知道用malloc()分配多少空间?

Kre*_*dns 10 c malloc memory-management sizeof char

我是C新手,我来自C#.我一直在学习内存管理和malloc()功能.我也遇到过这段代码:

char *a_persons_name = malloc(sizeof(char) + 2);
Run Code Online (Sandbox Code Playgroud)

我不明白的是这分配了多少空间a_persons_name.是分配2个字符(例如AB)还是别的什么?

我也知道你有时可以"幸运" malloc并使用未分配的空间(这可能导致数据损坏和seg故障).那么我怎么知道我分配了多少空间以及我需要多少空间?

Bar*_*lly 17

该片段为2个字符的名称分配了足够的空间.

通常,字符串缓冲区将从某处填充,即I/O. 如果提前知道字符串的大小(例如从文件或键盘读取),通常使用以下三种方法之一:

  • 为任何给定字符串定义最大大小,分配该大小+ 1(对于空终止符),最多读取多个字符,如果提供的字符太多则错误或盲目截断.不是非常用户友好.

  • 分阶段重新分配(最好使用几何系列,例如加倍,以避免二次行为),并继续阅读直到达到结束.编码并不容易.

  • 分配一个固定的大小,并希望它不会被超过,并且当这个假设失败时崩溃(或被拥有)可怕.易于编码,易于破解.例如,请参阅gets标准C库.(切勿使用此功能.)

  • 字符串是C中最破碎的部分.我建议编写伪OO'CtringBuilder'结构或类似结构,并创建例如StrBufPrintf,StrBufGets,StrBufScanf等来集中这些操作.标准C库没有多大帮助.C++略胜一筹,因为你通常有10个不同的字符串类可供选择,一个用于每个不同的框架.是的,我是讽刺的. (4认同)
  • 一种语言,其中最简单的字符串方式是执行字符串的错误方法,标准库包含一个错误方式的示例,对于字符串来说似乎已经破坏了. (3认同)
  • 当然,只要您自己构建适当的抽象,C语言中的字符串就很容易.但作为一名语言设计师和实施者,我认为事实上,C通过其特别弱的字符串方法几乎是单独负责数百万甚至数十亿美元的损失. (3认同)
  • 为什么分配足够空间的所有方法都很糟糕?有没有简单的方法! (2认同)
  • 简单的方法是(1)使用字符串是基本类型的语言; (2)使用提供字符串行为的库; 或(3)学习您正在使用的语言.如果您不想学习如何使用这些工具,为什么还要尝试.找另一种更适合你的语言(我不是试图在这里侮辱,只是务实). (2认同)

pax*_*blo 5

好吧,首先,sizeof(char)总是1,所以你可以malloc(3).

您分配的内容有足够的空间容纳三个字符.但请记住,您需要一个用于C字符串的空终止符.

你倾向于找到的东西是这样的:

#define NAME_SZ 30
: : :
char *name = malloc (NAME_SZ+1);
Run Code Online (Sandbox Code Playgroud)

为名称和终结符字符获取足够的存储空间(请记住,字符串"xyzzy"存储在内存中:

+---+---+---+---+---+----+
| x | y | z | z | y | \0 |
+---+---+---+---+---+----+
Run Code Online (Sandbox Code Playgroud)

有时使用非基于字符的数组,您会看到:

int *intArray = malloc (sizeof (int) * 22);
Run Code Online (Sandbox Code Playgroud)

这将为22个整数分配足够的空间.

  • 不,实际上,sizeof(char)是*always*1.来自c1x,"6.5.3.4 sizeof运算符",第3段:当应用于具有char,unsigned char或signed char类型的操作数时(或者是合格的)其版本)结果为1. (3认同)