我已经为 C 中的字符串创建了一个宏来保留内存。它看起来像这样:
#define newString(size) (char*)malloc(sizeof(char) + size)
那么我有什么理由不在自己的个人项目中使用这个宏吗?我知道我不应该在生产代码中执行此操作,因为它需要每个人都拥有该头文件,并且每个人都知道newString
是一个宏。
答案 0 :(得分:5)
(char*)malloc(sizeof(char) * (size+1))
会更合适(+1是在字符串末尾说明NULL,如果适用的话)。
如果正在复制字符串,strlen()不会考虑终止字符串的NULL,因此需要额外的内存char
。
答案 1 :(得分:1)
我不太确定使用预处理器为自己节省一些打字是个好主意。 (这条道路是黑暗而可怕的。)不久你就会想要在你的宏中添加一些内容,而你将开始遇到难以调试的问题。
如果您正在进行自己的内存管理,请使用实际功能并提供免费的“删除”功能。
如果您担心性能问题,那么您的编译器就足够智能,可以为您编写很少的函数。
答案 2 :(得分:0)
您应该检查分配是否成功。
char* ptr = (char*)malloc(sizeof(char) * size); //Not '+' size!!
if (ptr == 0) //or NULL if defined
{
//cannot allocate
}
但使用宏
没有问题答案 3 :(得分:0)
主要原因是sizeof(char)
被定义为始终为1.所以你应该写:
malloc(size)
,写这个比newString(size)
更短。此外,malloc
会返回void *
,您无需在C中投射。
另一个原因是,当你的意思是+
时,你不会写*
。
答案 4 :(得分:0)
你的宏等同于
malloc(size + 1)
与C一样,您无需根据定义投射malloc
和sizeof(char)
等于1
的结果。所以它并没有真正为你节省很多打字。即使在你的个人项目中,我也会建议不要这样做,因为我认为没有任何好处。