1

所以我已经有大约一年没有用 C 写过任何东西了,今天早上我想我会写点什么。我/非常/很快遇到了问题。以下极其基本的代码无法运行:

 #include <stdlib.h>
 #include <stdio.h>
 int main(int argc, char* argv)
 {
        printf("arg is %s \n", argv[1]);
 }

我收到以下错误

gcc dink.c -o dink
dink.c: In function ‘main’:
dink.c:6:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has  type ‘int’ [-Wformat]
./dink menkmenk
make: *** [all] Segmentation fault (core dumped)

这是怎么回事?

编辑:我得到了为什么代码不起作用的答案,但我仍然想知道为什么编译器认为我在第二个参数中持有一个 int 。

4

4 回答 4

5

其他答案告诉您如何解决问题。这就是您收到该特定错误消息的原因。

C 有更改表达式类型的规则……它们在很多时候会自动转换为其他类型。在我上大学的地方,在我参加的课程中,这些转换被非正式地称为“促销”,但我想正确的技术术语是“转换”(参见下面@Steve Jessop 的评论)。

这是一个例子:

float f = 3.14f + 2;

在此示例中,我们要求将整数添加到浮点数中。根据 C 类型规则,整数值将被转换为浮点数(作为标准中记录的“通常的自动转换”的一部分),然后将两个浮点数相加,给出与我们输入相同的结果:

float f = 3.14f + 2.0f;

f顺便说一句,如果我们离开后缀,将会发生更多的转换。考虑这个表达式:

float f = 3.14 + 2;

由于3.14没有用f后缀声明,它是一个类型的常量double。然后将整数2转换为double,进行加法,结果为double。但是必须将它分配给一个类型的变量,float以便将其从doubleto转换float,并且您可能会看到一个编译器警告,当从doubleto转换时可能会丢失精度float

无论如何,回到你的问题:

当您声明argv为类型char *,然后引用时argv[1],表达式的类型argv[1]是 type char。但是 C 将类型从 转换charint,从而导致了令人困惑的错误消息。

您可以在此处阅读有关 C 的类型转换规则的更多信息:

http://www.eskimo.com/~scs/cclass/int/sx4cb.html

编辑:将上述内容更改为始终使用“转换”一词而不是“促销”来回应@Steve Jessop 的评论。

于 2013-05-27T18:17:40.727 回答
3

尝试,

int main(int argc, char** argv)

或者

int main(int argc, char* argv[])
于 2013-05-27T18:04:59.617 回答
2

你的签名main是错误的。 argv应该是一个字符串数组。IE

int main(int argc, char* argv[])
//                           ^^
于 2013-05-27T18:03:19.803 回答
1

将 argv 声明为char **argvor更为常见char *argv[]

char *argv表示 argv 是指向 a 的指针char,这是相当不同的。

因此

int main(int argc, char **argv)

或者

int main(int argc, char *argv[])

应该更符合你的预期。

此外,不希望这样请求argv[1];您通常至少应该检查是否存在这样的论点。

于 2013-05-27T18:08:57.833 回答