[英]c string manipulation to pass to execvp(2)
這可能是因為我是C編程的新手,但如果我正確地回憶起我的講師
第1部分) execvp(2)
接受2個參數(obv),第一個是命令,第二個是字符串數組,如
char *args[] = {"ls", "-l", "-a", NULL};
我可以解釋一下char *args[]
如何使這個字符串數組而不是帶有字符的數組(C null終止字符串)?
第2部分)
我怎樣才能使它能夠通過字符串添加到這個數組字符串? 我可以做嗎?
int i;
char *args[255];
for(i = 0; i < strlen(lol); i++)
{
args[i] = //new string being passed in at runtime
}
它會像那樣工作嗎? 假設我正在從stdin中分解輸入,我想將參數放入args[i]
。
第1部分)
char *args[] = {"ls", "-l", "-a", NULL};
上面的代碼意味着,您正在創建一個char指針數組。
根據(雙引號)“”內的字符串的定義,每個字符指針都被分配固定大小的內存,這些字符串在編譯時本身內(大括號){}。 在這種情況下,您無法修改char指針指向的字符串的大小。您仍然可以修改指向的字符串的內容。
它類似於char [][4]={"ls", "-l", "-a", NULL};
第2部分)如果不使用malloc或calloc顯式地為char指針分配內存,則不能這樣做。 然后使用strncpy將字符串復制到數組中的char指針。
在第1部分中,固定大小的內存在編譯時自行分配。在第2部分中,由於根本沒有分配任何內存,所以不能這樣做。
這個聲明char *args[]
可以解密為“args是一個指向char的指針數組”。 這意味着數組的每個條目都指向一個或多個char
所在的位置。
當您執行靜態初始化聲明args
,編譯器會保留空間以確切地擁有初始化器的數量,每個初始化器都有指向char類型的指針(在您的情況下,數組中有4個指針)。
對於每個初始化字符串,編譯器保留空間(通常在只讀數據段中)並將單個字符放在那里,其中null是最后一個字符。 數組args
包含指向此位置的指針。 因此,你有一個間接的水平。
args[0] ---- points at memory location where 3 chars are -----> 'l', 's', '\0'
關於2),你可以這樣做,因為args
是指針數組(而不是2D數組)。 但是,您應該為空終止的字符序列分配正確的內存位置。 但是你必須確保args
數組的大小合適。 如果在數組聲明期間沒有給出大小,則編譯器僅為提供的初始化器分配足夠的空間,並且以后不可能更改大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.