如何检查char *是否指向C中的字符串字面值

我有一个结构体

struct request {
  int code;
  char *message;
};

我想要正确释放

我有以下功能:

void free_request(struct request *req) {
  if (req->message != NULL) {
      free(req->message);
  }
  free(req);
  req = NULL;
}

问题是,当我尝试释放使用字符串文字创建的请求时,编译器会收到一个“free():invalid pointer”/ segfault错误信息:

struct request *req;
req = malloc(sizeof(struct request));
req->message = "TEST";
free_request(req);

因为我想在不同的地方创建请求结构,一旦使用文字(在客户端),并且一旦使用从套接字(在服务器端)读取的*字符,我想知道是否有一个函数来确保我不要尝试释放文字,同时仍然允许我释放我使用malloc创建的消息。

没有标准函数可以让您知道指针是否被动态分配。您应该在结构中包含一个标志来通知自己,或者只使用动态分配的字符串(在这种情况下,strdup是您的朋友)。根据您的网络设置,使用strdup可能更简单(实际上,使用strdup更简单)。

使用strdup:

struct message* req;
req = malloc(sizeof *req);
req->message = strdup("TEST");
free_request(req);

带旗:

struct message
{
    int code;
    char* message;
    bool isStatical; // replace to 'char' if bool doesn't exist
};

void free_request(struct message* req)
{
    if (!req->isStatical) free(req->message);
    free(req);
}

struct message* req;
req = malloc(sizeof *req);
req->message = "TEST";
req->isStatical = 1;
free_request(req);

另外,创建对象时,不要忘记将已分配的内存置零。这样可以节省你很多麻烦。

req = malloc(sizeof *req);
memset(req, 0, sizeof *req);

那么,并将req设置为空,从free_request将不会有任何影响。你需要采取一个struct消息**,或者在函数调用之后自己做。

翻译自:https://stackoverflow.com/questions/3398719/howto-check-if-a-char-points-to-a-string-literal-in-c

转载注明原文:如何检查char *是否指向C中的字符串字面值