gpt4 book ai didi

有人可以解释一下以下代码中如何将内存分配给双指针吗

转载 作者:行者123 更新时间:2023-11-30 14:51:26 33 4
gpt4 key购买 nike

请解释一下下面的qsort标准代码中,为什么argv的地址和argv[0] 不同。我是c语言的新手。尝试理解双指针概念。

    static int compare( void const * p1, void const *p2 )
{
return strcmp( * ( char * const* )p1, * ( char * const * )p2 );
}

int main( int arg, char **argv )
{
if( arg < 2 )
{
fprintf( stderr, "arguments should be more than 1" );
exit( 0 );
}
printf( "\n address of argv %p", &argv );
printf( "\n address of argv[ 0 ] %p", &argv[ 0 ] );
printf( "\n address of argv[ 1 ] %p", &argv[ 1 ] );
printf( "\n address of argv[ 2 ] %p", &argv[ 2 ] );
printf( "\n Value of argv[ 0 ] %p %s", argv[ 0 ], argv[ 0 ] );
printf( "\n Value of argv[ 1 ] %p %s", argv[ 1 ], argv[ 1 ] );
printf( "\n Value of argv[ 2 ] %p %s \n ", argv[ 2 ], argv[ 2
] );

qsort( &argv[ 1 ], arg - 1, sizeof( char* ), compare );
int j;
for( j = 1; j < arg; j++ )
{
puts( argv[ j ] );
printf( "\n" );
}
return 0;
}

输出:./a.out 拉姆亚·乌沙

address of argv 0x7ffede23dde0   
address of argv[ 0 ] 0x7ffede23dee8
address of argv[ 1 ] 0x7ffede23def0
address of argv[ 2 ] 0x7ffede23def8
Value of argv[ 0 ] 0x7ffede23e2f0 ./a.out
Value of argv[ 1 ] 0x7ffede23e2f8 ramya
Value of argv[ 2 ] 0x7ffede23e2fe usha


Why address of argv is '0x7ffede23dde0' whereas argv[ 0 ] it is
0x7ffede23dee8

最佳答案

那么为什么它应该是相同的呢? (OP问为什么argv和argv[0]的地址不同。)

main() 是一个函数。现在是指向它的指针数组 - 该数组衰减为指向第一个元素的指针。现在局部变量 argv 包含该值。 (该指针值)。

你打印它。然后现在您访问第一个元素的地址。该地址正在被打印。现在最重要的是它的内容,它是 char 数组的衰减指针值。

您打印的这三个不同的地址。是的,它们是不同的。它们并不是具有不同语法糖的同一事物。不再有惊喜。

为了让您有一个更清晰的想法 - 认为这个 &argv[0] 只不过与 argv 相同。毫不奇怪,它与 &argv 不同。

同时打印指针应该是 void* 类型转换。同时启用编译器警告,您将看到更多错误/警告,请检查它们。

关于有人可以解释一下以下代码中如何将内存分配给双指针吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48326619/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com