何时释放字符串指针?

时间:2015-09-04 18:59:34

标签: c linux

我有一个定义如下的宏。同样在我的程序中,我需要打印出两种样式的错误消息:

  1. PRINT_ERR("This is Error!");
  2. 使用asprint构建日志字符串,然后将其打印出来:
  3.  char *log = NULL;
     int age = 0;
     asprintf(&log, "error: %s on: %d", "Name", age);
     PRINT_ERR(log);
    

    使用下面的宏定义,样式#1将抛出异常。 所以,在宏定义中,我如何弄清楚在哪种情况下,我需要释放字符串" y"?

    #define PRINT_LOG(x, y) { \
        printf ( "%s: %s\n", x, y);\
        free(y);\    //how do I know "y" is a pointer, or a string like this "string"?
    }
    
    #define PRINT_ERR(y) { PRINT_LOG ("ERR ", y) }
    

2 个答案:

答案 0 :(得分:3)

你不能使用两个不同的宏 - 沿着下面的行吗?

#define PRINT_ERR(y) ....

#define PRINT_ERR_FREE(y) \
    do { \
        PRINT_ERR(y);  \
        free(y);\
     } while (0);

答案 1 :(得分:2)

你的宏/函数/无论无法区分字符串文字和动态分配字符串,因此,你不能总是free()字符串参数,因为字符串文字不能是{{1 }}倒是。

一个简单的解决方案是编写可变参数函数(或者如果您更喜欢,还可以使用可变参数宏):

free