首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传入char *argv[]与声明char *argv有什么不同?

传入char *argv[]与声明char *argv有什么不同?
EN

Stack Overflow用户
提问于 2014-02-07 15:57:42
回答 2查看 450关注 0票数 1

我的c技能很生疏,所以如果这是一个愚蠢的问题,我很抱歉,但我甚至无法想到要去寻找这个简单问题的答案。此代码编译时没有任何警告:

代码语言:javascript
复制
#include <ruby.h>

int run_script( int argc, char *argv[] )  {
  ruby_sysinit(&argc,  &argv);
}

但是,当我编译这段代码时,我会收到以下警告:

代码语言:javascript
复制
#include <ruby.h>

int run_script( char * parameters )  {
    int argc=0;
    char *argv[1];
    ruby_sysinit(&argc,  &argv);
}

run_script_3.c: In function 'run_script':
run_script_3.c:7: warning: passing argument 2 of 'ruby_sysinit' from incompatible pointer type

在这两种情况下,我似乎都在传递相同的指针类型。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-07 16:40:27

ruby_sysinit的签名如下(如果我选择了错误的ruby版本,请纠正我,我的系统上没有头文件):

代码语言:javascript
复制
void ruby_sysinit(int *argc, char ***argv);

这意味着以下内容将进行汇编:

代码语言:javascript
复制
extern void ruby_sysinit(int *argc, char ***argv);

int run_script(char * params)  {
    int argc = 0;
    char **argv;
    ruby_sysinit(&argc, &argv);
}

现在,当您声明char *argv[1]时,您告诉编译器这是一个带有一个元素的数组。这与char **argv不一样。

编辑:您可能会发现关于这样的问题这篇文章(在另一个问题中有关联)很有用。

票数 0
EN

Stack Overflow用户

发布于 2014-02-07 16:52:58

问题是,形式参数声明中的数组等价于指针。声明,声明

代码语言:javascript
复制
int run_script( int argc, char *argv[] )  { ... }

等于

代码语言:javascript
复制
int run_script( int argc, char **argv)  { ... }

因为不能将数组作为参数发送。您只能发送指针,即使将数组作为实际参数,也始终将其转换为指针。然后,如果您放置&argv,您将得到这个参数的地址,因此它是存储argv值的系统堆栈中的一个地址。

另一方面,代码中的数组仍然是不同类型的数组。在您的示例中,&argvrun_script的第一个版本中为char ***类型,而在第二个版本中为char *(*)[1]类型。它看起来是相同的类型,但事实并非如此。在运行时,有更大的差异,因为两个调用将两个完全不同的值发送到ruby_sysinit

你的第二个例子:

代码语言:javascript
复制
int run_script( char * parameters )  {
    int argc=0;
    char *argv[1];
    ruby_sysinit(&argc,  &argv);
}

可能会导致分段错误,因为应用在数组上的操作系统&提供指向数组第一个元素的指针。因此,调用ruby_sysinit(&argc, &argv);发送与ruby_sysinit(&argc, argv);相同的值,即指向char*的值,而不是ruby_sysinit所期望的指向char*的指针。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21632255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档