0

首先,我不得不说我是 C 编程新手。我要做的是编写一个程序,该程序接受参数输入并将其转换为整数,然后返回其值。我的代码如下所示:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
   int fromArgv = NULL;  /* holds value from argv[1] */
   fromArgv = atoi (argv[1]);    /* convert argv[1] to int */

   /* if incorrect no. of arguments entered */
   if (argc != 2) {
   fprintf (stderr, "error: wrong number of arguments\n");
   exit (EXIT_FAILURE);
   } 

   return fromArgv;
}

尝试编译时出现以下错误:

ex1.c: In function ‘main’:
ex1.c:6:18: error: initialization makes integer from pointer without a cast [-Werror]
cc1: all warnings being treated as errors
4

5 回答 5

5

你的问题是线路

int fromArgv = NULL; 

我相信NULL通常定义为(void *) 0,它是一个指针。您将此指针分配给一个int变量,这会给您带来错误。

fromArgv但是,在这种情况下不需要初始化。你可以这样做:

int fromArgv;  /* holds value from argv[1] */
fromArgv = atoi (argv[1]);    /* convert argv[1] to int */

甚至只是

int fromArgv = atoi (argv[1]);    /* convert argv[1] to int */

但是,您必须做的是确保argv[1]在访问它之前存在,这样如果用户没有输入任何命令行参数,您就不会收到段错误。您应该if (argc != 2)在分配fromArgv.

于 2012-11-03T17:49:31.813 回答
3

NULL是一个空指针常量,并且您尝试将其分配给一个数值 ( fromArgv),因此您的编译器会报告一个警告。

以下初始化工作正常:

fromArgv = 0;

虽然,它没有用,因为您正在下一行修改变量的值:

int fromArgv = atoi(argv[1]);

顺便说一句,从(它通常保留给错误代码)返回这种值是一个坏主意main,而且你太晚了参数的数量。

于 2012-11-03T17:49:18.370 回答
1

正如其他人所提到的,您正在使用“空指针”(从类型的角度来看是指针)初始化一个整数,这是错误的。你想把它初始化为零,

       int fromArgv = 0;

然后,您应该选择参数并将其转换为 int之后而不是在检查参数数量之前。因此,您应该在零件之后移动“atoi”行if (argc != 2)

还要考虑使用strtol而不是atoi. 前者允许您检查转换是否成功。

于 2012-11-03T18:12:10.553 回答
0

您无法将 fromArgv 初始化为 NULL,因为 NULL 是一个指针,并且您将其分配给 int 只需将行更改为 int fromArgv ;

于 2012-11-03T17:54:30.217 回答
0

为什么你必须初始化 fromArgv ?

只是

int fromArgv = atoi(arg[1]);

应该可以正常工作

于 2012-11-03T18:00:23.893 回答