Execv..c中的(char *)0是什么?

时间:2016-05-08 11:58:24

标签: c

例如,如果我有

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}

这是什么?

3 个答案:

答案 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

他们可能已将NULLexecv混为一谈, 要求具体execl或等效(char *)0

这是因为(char *)NULL通过varargs机制读取参数,因此实际参数必须具体为execl。将char *风险NULL传递给定义为NULL的常量0的风险,这会破坏varargs机制。