[英]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.