【问题标题】:Different output between argv and normal array of stringsargv 和普通字符串数组之间的不同输出
【发布时间】:2013-08-23 10:41:07
【问题描述】:

对于下面给出的程序,为什么第一个printfargv&argv 打印不同的值?第二个printfa&a 打印相同的值。传递给程序的参数变量的存储机制是什么?

#include<stdio.h>
    int main(int argc, char * argv[]){
    char * a[10];  
    printf("%d %d\n\n",argv,&argv);
    printf("%d %d",a,&a);  
    return 0;  
}

将命令行参数存储到字符串数组的机制是什么

【问题讨论】:

  • printf("%d %d",a,&a);这里 &a 和 a 将指向同一个地址...所以你不需要同时打印它们。并使用 %p 而不是 %d 来打印地址。
  • 我认为那是因为 argv 指针已初始化,但您的 a 指针没有,所以它得到了相同的地址

标签: c arrays pointers command-line-arguments


【解决方案1】:

问题不在于argv 特殊,而在于函数参数传递。试试这个程序:

#include<stdio.h>

void foo(int a[])
{
    int b[10];
    printf("foo :%p %p\n",a,&a);
    printf("foo :%p %p\n",b,&b);
}

int main(int argc, char* argv[])
{
    int a[10];
    printf("main:%p %p\n", a, &a);
    foo(a);
    return 0;
}

我机器上的输出:

main:0x7fffb4ded680 0x7fffb4ded680
foo :0x7fffb4ded680 0x7fffb4ded628
foo :0x7fffb4ded630 0x7fffb4ded630

第一行和第三行并不奇怪,因为对于数组arrarr&amp;arr 具有相同的值。第二行需要解释一下。

如你所见,当a在函数foo中被传递时,a的值并没有改变,但是&amp;a的地址却改变了,因为C函数总是按值传递参数,会有是函数内部参数的本地副本。

argv 相同,因为它只是函数main 中的一个参数。


编辑:对于那些不同意我的人,我的回答并不反对另一个答案。相反,它们相互补充。 argv 正是一个指针,因为它是一个作为函数参数传递的数组,并且它“衰减”为一个指针。同样,argv 并不特殊,它的作用与作为函数参数传递的其他数组没有什么不同,这就是我的示例代码的重点。

【讨论】:

  • 不错的示例代码!在我看到你的答案之前,我只是认为 main 中的 argv 有一些特殊的地方!
  • 这不是真正的答案。对于数组类型的任何变量a&amp;aa 作为指针将始终具有相同的地址。这是 C 中的数组类型如何工作的结果。不同的是argv不是数组类型。
  • @newacct 那为什么argv 是一个指针呢?正是因为它作为函数参数传递,并“衰减”成一个指针。
【解决方案2】:

您的示例中 argva 之间的区别来自 C 标准的第 6.7.6.3 和 7 段:

将参数声明为“类型数组”应调整为“类型限定指针”,其中类型限定符(如果有)是在 [和 ] 的数组类型推导。如果关键字 static 也出现在数组类型派生的 [ 和 ] 中,则对于函数的每次调用,对应的实际参数的值应提供对至少与指定元素一样多的数组的第一个元素的访问通过大小表达式。

因此argv 是一个有自己地址的指针,而a 是一个数组,a 指向数组的第一个元素的地址,与数组的地址相同数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2021-08-10
    • 1970-01-01
    • 2020-07-25
    相关资源
    最近更新 更多