簡體   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