簡體   English   中英

c字符串操作傳遞給execvp(2)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM