malloc() 将分配一块内存,如果成功则返回指向该内存的指针,如果不成功则返回 NULL。内存块的大小由malloc 的参数指定,以字节为单位。
sizeof 运算符以字节为单位给出其参数的大小。
char *someString = malloc(sizeof(char) * 50)
这将为不包括 NULL 字符的 49 个字符的字符串(C 样式的字符串必须以 NULL ('\0') 字符终止)分配足够的空间,并将 someString 指向该内存。
看起来您问题中的代码应该是malloc(sizeof(char) * 2);,因为sizeof(char) + 2 没有意义。
请注意,sizeof(char) 保证始终等于 1(字节)——但其他类型(如 long)的内存表示可能因编译器而异。
如果您尝试在已分配的内存之外进行读/写,那么您对动态分配的内存感到(不)幸运。
例如,
char *someString = malloc(10);
strcpy(someString, "Hello there, world!");
printf("%s\n", someString);
第一行为 9 个字符和一个 NULL 字符分配了足够的空间。
第二行尝试将 20 个字符(19 + NULL)复制到该内存空间中。这会超出缓冲区,并可能导致一些非常机智的事情,例如覆盖相邻的内存或导致段错误。
第三行可能会起作用,例如,如果在 someString 旁边分配了内存,并且“Hello there, world!”跑进那个内存空间,它可能会打印你的字符串加上下一个内存空间中的任何内容。如果第二个空格被 NULL 终止,它就会停止——除非它不是,在这种情况下它会跑掉并最终出现段错误。
这个例子是一个非常简单的操作,但是很容易出错。 C 很棘手——要小心。