指针的行为; char**argv

sta*_*k_A 0 c linux pointers argv

当我测试双指针行为时,我得到了一个我不太了解的结果.

==>代码1:

int main (int argc , char **argv)
{

if(*argv+1 ==NULL)
{
    printf("NULL pointer \n");
    exit(0) ;
}
else
{ 
    printf("test double pointer[] : %s \n ",*argv+1);  

}

return(0);
}
Run Code Online (Sandbox Code Playgroud)

====>结果1

root@root:/home/aa/test# ./geip 1255
test double pointer[] : /geip 
root@root:/home/aa/test#
Run Code Online (Sandbox Code Playgroud)

===>代码2:

int main (int argc , char **argv)
{

if(*argv+9 ==NULL)
{
    printf("NULL pointer \n");
    exit(0) ;
}
else
{ 
    printf("test double pointer[] : %s \n ",*argv+9);
}
 return(0);
 }
Run Code Online (Sandbox Code Playgroud)

==>结果2:

root@root:/home/aa/test# ./geip 1255
test double pointer[] : 55 
root@root:/home/aa/test#
Run Code Online (Sandbox Code Playgroud)

==>结果3:

root@root:/home/aa/test# ./geip 
test double pointer[] : ELL=/bin/bash 
root@root:/home/aa/test#
Run Code Online (Sandbox Code Playgroud)

似乎printf从第n个字(1和9)显示我们如何解释指针的这种行为?

Tom*_*rdt 10

你错了.

*argv+1将被解释为(argv[0])+1,因为argv[0]"./geip"你得到"/ geip".

*argv+9将被解释为(argv[0])+9但由于argv[0]只有长度为6,结果是不确定的.

在您的情况下,argv可能存储为:

.  /  g  e  i  p \0  1  2  5  5 \0
0  1  2  3  4  5  6  7  8  9 10 11
Run Code Online (Sandbox Code Playgroud)

这解释了为什么+9让你"55"

但是你应该忘记它,因为它永远不会有用!这是未定义的行为,不应该使用.