哪种方法可以为字符串保留内存?

时间:2010-01-04 19:01:07

标签: c memory memory-management malloc c-preprocessor

我已经为 C 中的字符串创建了一个宏来保留内存。它看起来像这样:

#define newString(size) (char*)malloc(sizeof(char) + size)

那么我有什么理由不在自己的个人项目中使用这个宏吗?我知道我不应该在生产代码中执行此操作,因为它需要每个人都拥有该头文件,并且每个人都知道newString是一个宏。

5 个答案:

答案 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一样,您无需根据定义投射mallocsizeof(char)等于1的结果。所以它并没有真正为你节省很多打字。即使在你的个人项目中,我也会建议不要这样做,因为我认为没有任何好处。