0

答案:我没有正确初始化变量。

我需要记住指针声明在 C 中是如何工作的。

这段代码应该采用以下格式的一些命令行参数:

./foo 1 2 3 4 5 6 7 8 9 10 ...(任何合理数量的参数,只要它们能被 5 整除

我的计划是使用 5 个可变大小的 int 数组来存储参数以供以后在逻辑中使用。因此,如果我有 10 个参数,我将有 5 个 2-int 数组,依此类推。

int* IP1, IP2, BID, PN, EID;
int i;

if((argc < 2) || ((argc-1) % 5) != 0)
{ 
   /* Some error statements */
}

IP1 = (int*)malloc(argc-1);
IP2 = (int*)malloc(argc-1);  //This is line 26
BID = (int*)malloc(argc-1);
PN = (int*)malloc(argc-1);
EID = (int*)malloc(argc-1);

for(i = 0; i < argc-1; i+=5){
  IP1[i] = argv[i+1];
  IP2[i] = argv[i+2];        //This is line 33
  BID[i] = argv[i+3];
  PN[i] = argv[i+4];
  EID[i] = argv[i+5];
  printf("%d\t", i);
}

问题是,我得到了这些奇怪的错误

>cc foo.c -o foo
foo.c: In function ‘main’:
foo.c:26: warning: assignment makes integer from pointer without a cast
foo.c:27: warning: assignment makes integer from pointer without a cast
foo.c:28: warning: assignment makes integer from pointer without a cast
foo.c:29: warning: assignment makes integer from pointer without a cast
foo.c:33: error: subscripted value is neither array nor pointer
foo.c:34: error: subscripted value is neither array nor pointer
foo.c:35: error: subscripted value is neither array nor pointer
foo.c:36: error: subscripted value is neither array nor pointer

我不知道他们应该是什么或代表什么。我已经查过了,到目前为止没有任何帮助。我希望你们都可以。

编辑:作为记录,我尝试注释掉第 26-30 和 33-37 行,它编译得很好。只是想我会为后代添加。

4

3 回答 3

6

这个:

int* IP1, IP2, BID, PN, EID;

与此相同:

int *IP1;
int IP2;
int BID;
...

你要这个:

int *IP1, *IP2, *BID, *PN, *EID;

但更一般地说,尽量避免在同一行声明多个变量。

于 2012-05-12T10:04:31.177 回答
1

您的变量IP2, BID, PN, EID只有类型intnot int*。你必须*在他们每个人的前面写上。

您的方法存在一个问题,即*绑定只绑定到它正下方的变量。所以

int *intptr, intvar;

创建一个指向int和 类型变量的指针int。要拥有两个指针,您应该编写:

int *intptr, *intptr2;
//for more clarity
int *intptr;
int *intptr2;

或者(但请阅读评论!):

typedef int* intptr;
intptr IP1, IP2, BID, PN, EID;
于 2012-05-12T10:04:18.150 回答
1

在 C 语言术语中,声明如下所示:

type-specifier declaration-specifiers;

类型说明符是一种单独的类型,在您的情况下是int. 后面是声明说明符,一个逗号分隔的声明符列表。声明器不仅由它声明的标识符组成,还包括所有*,[](),以使其声明看起来像它的用途。有了这个解释,你声明的内容就很明显了

int* IP1, IP2, BID, PN, EID;

它是一个*IP1,它是一个指向 int 的指针,其余的都被声明为 int。这就是为什么经验丰富的 C 程序员推荐

  • *向声明器中的标识符移动
  • 每行只声明一个标识符

这就是我编写声明的方式:

int *IP1, *IP2, *BID, *PN, *EID;
于 2012-05-12T10:18:32.873 回答