例如,如果我有
int main()
{
int status;
pid_t pid;
char* arg[]= {"ls", "-l", "/usr/include",(char *)0};
if ((pid=fork())==0)
{
/* CODICE ESEGUITO DAL FIGLIO */
execv("/bin/ls", arg);
/* Si torna solo in caso di errore */
exit
为什么在char* arg[]= {"ls", "-l", "/usr/include",(char *)0};
行
这是元素 *(char )0} ?
这是什么?
答案 0 :(得分:3)
它是NULL
指针。它在数组中起到相同的作用,因为null终结符字符'\0'
在C字符串中提供 - 提供了一种方法来确定集合中的最后一个有效位置而不显式传递它的长度。
基本上,execv
需要知道要传递多少参数。 C不提供查找传递给函数的数组长度的方法,因此两个常见模式将长度传递给单独的参数并使用marker元素终止序列。对于指针数组,NULL
是一个自然的标记元素。
编写相同表达式的另一种常用方法是
char* arg[]= {"ls", "-l", "/usr/include", NULL};
答案 1 :(得分:0)
(char *)0相当于NULL
指针
答案 2 :(得分:0)
这样做的目的是使execv
函数知道何时停止读取参数。
毕竟,通过传递arg
,你只传递一个指向第一个参数的指针。 execv
函数将通过递增此参数来查找所有参数,以查找下一个参数,直到找到特殊的sentinel值。根据{{1}}的文档:
当然,指针数组必须以NULL指针终止。
execv
是一个空指针。
那么为什么这个人写(char *)0
而不是(char *)0
?
他们可能已将NULL
与execv
混为一谈, 要求具体execl
或等效(char *)0
。
这是因为(char *)NULL
通过varargs机制读取参数,因此实际参数必须具体为execl
。将char *
风险NULL
传递给定义为NULL
的常量0
的风险,这会破坏varargs机制。