从C中的另一个函数修改数组

时间:2013-07-21 12:28:36

标签: c arrays function pointers

这是我的main功能:

main(){

    int *seats[50] = {0};
    char x;

    do{
        printf("A-Add Reservation\tC-Cancel Reservation\n");
        scanf("%c", &x); 
    } while(x != 'a' && x != 'c');

    switch(x){
    case 'a':
        addRes(&seats); 
        break;
    default: 
        break;
    }
}

我正在尝试将seats[]传递给addRes()函数,以便我可以在addRes()内对其进行修改。这是功能:

void addRes(int **seats[]){
    int s, i, scount=0, j=0, k=0, yourseats[]={0};
    printf("How many seats do you require? ");
    scanf("%i\n", &s);
    for(i=0;i<=sizeof(*seats);i++){
        if(*seats[i] == 0)
            scount++;
    }
    if(scount >= s){
        for(i=0;i<=s;){
            if(*seats[i] == 0){
                yourseats[j]=i;
                *seats[i]=1;                
                i++; j++;
            }
            else i++;
        }
        printf("Your seat numbers are: \n");
        while(k < j){
            printf("%i\n", yourseats[k]); 
            k++;
        }   
    }
    else {
        printf("Sorry, there are not enough seats available.\n");
    }
}

它汇编了警告:

Line 15 (*seats[i]=1;) Assignment makes pointer from integer without a cast.  
Line 53: (addRes(&seats);) Passing argument 1 of 'addRes' from incompatible pointer       type.
Line 3: (void addRes(int ** seats[]){) Expected 'int ***' but argument is of type  'int *(*)[50]'.

在运行程序时,它会到达

How many seats do you require?  
输入值后

并且不执行任何操作。 任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:5)

函数参数中的声明int **seats[]为== int ***seats,这意味着*seats[i]的类型为int*并且您正在为其分配一个数字,即不兼容的类型错误:

*seats[i] = 1; 
  ^         ^ int  
  |        
    int* 

incompatible types 

addRes(&seats);

中的下一个 seats指针数组中,如果int*[50] &seat数组指针且类型为{{1},则为&seat is int*(*)[50]其中函数参数类型为int ***,因此再次键入不兼容的错误 请注意,您还会收到编译器的合理错误消息:Expected 'int ***' but argument is of type 'int * (*)[50]'.

建议:

正如我在您的代码中看到的,您没有为函数seats[i]中的addRes()分配内存,因此我理解您不需要将seat[]数组声明为数组指针,但你需要简单的int数组。

在main()中更改声明:

int *seats[50] = {0};

应该只是:

int seats[50] = {0};
 // removed * before seats

接下来只需将seats[]数组的名称传递给addRes()函数,其中函数声明应为

addRes(int* seats)

or  addRes(int seats[]) 

它使您的工作在函数addRes()中非常简单,您可以将其元素作为seats[i]访问(并且不需要使用额外的*运算符)。

数组长度:

您的代码中的另一个概念问题是您使用sizeof(*seats)来了解数组的长度。这是不对的!因为在addRes()函数中seats不是一个数组而是一个指针,所以它会给你地址的大小(但不是数组长度)。
是的,告知seats[]函数中addRes()的大小,发送一个名为length的额外参数,最后如下所示声明addRes()(读取注释):

void addRes(int seats[], int length){
     // access seat as 
     //  seat[i] = 10;
     // where i < length 
}

从main()调用此函数,如下所示:

addRes(seats, 50);
  // no need to use &

目前你还没有遇到的另一个问题,但是你很快就会遇到这样的问题,因为你将在函数addRes()中运行scanf()需要额外的输入的代码。要解决此更改:scanf("%i\n", &s);scanf("%i", &s);,不需要scanf()格式字符串中的额外\n

答案 1 :(得分:4)

int *seats[50] = {0};

这是一个整数指针数组,你需要的只是一个实际的数组,所以放弃*导致int seats[50] = {0};

此外,您对数组的函数签名是错误的,void addRes(int seats[])也可以。

最后,要将数组传递给新签名,您可以直接传递数组,而不需要任何一元地址运算符(当作为参数传递给函数时,数组会衰减为指针):

addRes(seats);

同样如指出的那样,在分配数组元素时,您需要删除*

seats[i]=1;

绰绰有余。对于数组元素进行比较的if语句也是如此。

关于addRes功能:

for(i=0;i<=sizeof(*seats);i++)

你只能以这种方式得到指针的大小,这在32位机器上是4.这个技巧对传递给函数的数组不起作用。您需要单独传递数组。

您可以通过以下方式修复它:

  1. 将地址的功能签名更改为:

    • void addRes(int seats[], int size)
  2. 在main中以下列方式之一传递大小:

    • 直接:addRes(seats, 50);

    • 间接地:addRes(seats, sizeof(seats)/sizeof(int));

  3. 请注意,以上只适用于 local 到此函数数组的范围,它不会对您作为函数的参数(或动态分配的数组)获取的数组起作用

    另一个问题与scanf有关,您应该放弃\n。使用scanf("%i", &s);