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库.(切勿使用此功能.)
好吧,首先,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个整数分配足够的空间.