繁体   English   中英

c中的自由字符指针

[英]Free char pointer in c

我试图找出使用c代码的文件类型,这里是代码

char *get_file_type(char *path, char *filename)
{
    FILE *fp;
    char command[100];
    char file_details[100];
    char *filetype;

    sprintf(command, "file -i %s%s", path, filename);
    fp = popen(command, "r");
    if (fp == NULL) {
        printf("Failed to run command\n" );
        exit(1);
    }
    while (fgets(file_details,  sizeof(file_details)-1, fp) != NULL) {
         filetype = (strtok(strstr(file_details, " "), ";"));
    }

    pclose(fp);
    return filetype;
}

这里不是声明命令[],我可以使用*命令吗? 我试图使用它,但它抛出异常。 我们不需要释放像command []声明的变量吗? 如果有,怎么样?

声明数组时:

char command[100];

编译器为它分配内存(在这种情况下为100个字符), command指向该内存的起始位置。 您可以访问已分配的内存:

command[0]  = 'a';  // OK
command[99] = 'A';  // OK
command[100] = 'Z'; // Error: out of bounds

但你不能改变command的值:

command = NULL;     // Compile-time error

command超出范围时,将自动释放内存。


声明指针时:

char *commandptr;

你只创建一个指向char的变量,但它还没有指向任何东西。 尝试使用它而不初始化它是一个错误:

commandptr[0] = 'A';   // Undefined behaviour; probably a segfault

你需要使用malloc自己分配内存:

commandptr = malloc(100);
if (commandptr) {
    // Always check that the return value of malloc() is not NULL
    commandptr[0] = 'A';  // Now you can use the allocated memory
}

当你完成它时释放它:

free(commandptr);

你可以使用char *command; 但是,你必须为command分配一些内存以通过调用malloc()来引用,当你完成那个内存时,必须通过调用free()再次释放它。

正如您所看到的,这比使用固定大小的数组要多得多(正如您现在所做的那样),但它也可以更加安全,因为您可以创建一个大小合适的缓冲区,而不是希望命令的总长度不超过100个字符。

除此之外,您的代码有一个问题:函数返回的filetype指针指向数组file_details某个位置,但执行return语句时编译器将清理该数组,因此return的指针由function是指一些标记为“可以自由地用于其他目的”的内存。

如果get_file_type的结果一次只对一个文件有效并不是问题,则可以将file_details数组声明为static ,以便在调用该函数时保留它。

你为什么要改变它? 对于临时缓冲区,人们通常使用[]声明数组,因此他们不必担心垃圾处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM