c - strtok 和内存泄漏

标签 c memory free malloc strtok

我使用 strtok() 编写了一个简单的 url 解析器。这是代码

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char *protocol;
    char *host;
    int port;
    char *path;
} aUrl;


void parse_url(char *url, aUrl *ret) {

    printf("Parsing %s\n", url);
    char *tmp = (char *)_strdup(url);
    //char *protocol, *host, *port, *path;
    int len = 0;

    // protocol agora eh por exemplo http: ou https:
    ret->protocol = (char *) strtok(tmp, "/");
    len = strlen(ret->protocol) + 2;

    ret->host = (char *) strtok(NULL, "/");


    len += strlen(ret->host);

    //printf("char at %d => %c", len, url[len]);

    ret->path = (char *)_strdup(&url[len]);

    ret->path = (char *) strtok(ret->path, "#");

    ret->protocol = (char *) strtok(ret->protocol, ":");

    // host agora é por exemplo address.com:8080
    //tmp = (char *)_strdup(host);
    //strtok(tmp, ":");
    ret->host = (char *) strtok(ret->host, ":");
    tmp = (char *) strtok(NULL, ":");

    if(tmp == NULL) {
        if(strcmp(ret->protocol, "http") == 0) {
            ret->port = 80;
        } else if(strcmp(ret->protocol, "https") == 0) {
            ret->port = 443;
        }
    } else {
        ret->port = atoi(tmp);
    }


    //host = (char *) strtok(NULL, "/");




}

/*
 * 
 */
int main(int argc, char** argv) {
    printf("hello moto\n");

    aUrl myUrl;
    parse_url("http://teste.com/Teste/asdf#coisa", &myUrl);


    printf("protocol is %s\nhost is %s\nport is %d\npath is %s\n", myUrl.protocol, myUrl.host, myUrl.port, myUrl.path);

    return (EXIT_SUCCESS);
}

如您所见,我经常使用 strtok() 以便可以“切片”url。我不需要支持不同于 http 或 https 的 url,所以它的完成方式解决了我所有的问题。 我担心的是(这是在嵌入式设备上运行的)-我在浪费内存吗? 当我写类似的东西时

ret->protocol = (char *) strtok(tmp, "/");

然后调用

ret->protocol = (char *) strtok(ret->protocol, ":");

我的第一个指针ret->持有的协议(protocol)是否保留在内存中?我想也许我应该将第一次调用设置为 tmp 指针,调用 strtok 将 ret->protocol 指向字符串的正确部分(第二次调用),然后 free(tmp)。

使用 strtok 的最佳方式应该是什么?

最佳答案

要直接回答您的问题,strtok 只会返回一个指针,指向您作为输入提供给它的字符串中的某个位置——它不会为您分配新内存,因此不需要在任何指针上调用 free它会给你返回。

对于它的值(value),您还可以查看“strchr”和“strstr”,它们是在字符串中搜索单个字符或序列的非破坏性方法。

另请注意,您的内存分配在这里存在问题——您使用 strdup() 在解析函数中分配一个新字符串,然后将该内存块的片段分配给“ret”的字段。因此,您的调用者将负责释放 strdup 的字符串,但由于您只是在 ret 内部隐式传回该字符串,调用者需要神奇地知道传递给 free 的指针。 (可能是 ret->protocol,但也可能不是,这取决于输入的外观。)

关于c - strtok 和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1495368/

相关文章:

c++ - 由于我无法返回局部变量,从 C 或 C++ 函数返回字符串的最佳方法是什么?

c - 传递给 free() 的指针必须指向内存块的开头,还是可以指向内部?

c - 我是否造成了内存泄漏以及如何修复它

c - 指向字符宽度 typedef 的指针数组

c - LLVM C API。如何确定 LLVMValueRef 是整数类型还是指针类型?

c - 指向函数的空指针

ios - TensorFlow iOS 内存警告

c - Linux在父进程和子进程之间使用管道在c中传递值?

c++ - Linux 中的内存

C - 释放数组内的指针