将数组传递给函数的正确方法?

时间:2015-12-13 16:00:10

标签: c arrays function parameters

我对C比较陌生,无法弄清楚代码有什么问题?

我在编译期间收到2个警告,并且在运行时期间出现Segmentation fault core dump错误。有谁能解释为什么?我正在运行Ubuntu作为虚拟机。这是将数组声明/传递给函数的正确方法吗?

#include <stdio.h>

//Loop handlers 
int i, j, m, n;
int c;
int cap[26];


//Funtions prototype
void countingChars(void);
void vertcalHistogram(int [], int size);    //Warning: expected ‘int *’ but argument is of type ‘int’ (helloworld)
void dashes(void);

int main (void)
{
    countingChars();
    vertcalHistogram( cap[26], 26); //Warning: passing argument 1 of ‘vertcalHistogram’ makes pointer from integer without a cast [enabled by default] (helloworld)
    //dashes();
    getchar();
    return 0;
}

void countingChars(void)
{
    while((c = getchar()) != EOF)
    {
        if(c >= 65 && c <= 90)
            ++cap[c - 65];

        if(c >= 97 && c <= 122)
            ++cap[c - 97];

        for(i = 0; i < 26; i++)
            printf("%d", cap[i]);
        printf("\n");

    }   
}
void dashes(void)
{
    printf("\n");
    printf("\n");

    for(i = 0; i < 40; i++)
        printf("_");

    printf("\n");

    for(i = 0; i < 40; i++)
        printf("_");

}

void vertcalHistogram(int cap[], int size)
{
    for(i = 0; i < size; i++)
    {   
        printf("||");
        for(j = 0; j < cap[i]; j++)
            printf("*");
        printf(" ~~ %d", cap[i]);
        printf("\n");
    }
}

4 个答案:

答案 0 :(得分:2)

cap[26]cap的第27个元素,由于cap[]int的数组,因此第27个元素的类型为int。您需要传递cap,而不是cap[26]

此外,如果您收到警告,您可以自行帮忙启用“将所有警告视为错误”选项,以便在收到警告时甚至不尝试运行程序。

另外,试试这个:#define COUNTOF(x) (sizeof(x)/sizeof((x)[0]))然后你可以这样调用你的函数:vertcalHistogram( cap, COUNTOF(cap) );

答案 1 :(得分:1)

正确的方法是传递数组本身的地址或第一个元素的地址:

vertcalHistogram( cap, 26);

vertcalHistogram( &cap[0], 26);

但似乎没有必要,因为cap是代码中的全局变量。

cap[26]超出了数组的范围。记住C索引从0开始。因此对于大小为26的数组,025是有效的索引范围。

答案 2 :(得分:1)

cap[26]表示int数组中索引为26的{​​{1}}。

如果您想传递cap,请写下cap

cap

答案 3 :(得分:0)

cap[26]是传递char数组cap[]的最后一个元素的1个元素。原始代码传递char而不是数组。当然不是意图。

void vertcalHistogram(int [], int size); 
int cap[26];
...
vertcalHistogram( cap[26], 26);  // bad
...
void vertcalHistogram(int cap2[], int size)  // Changed name for clarity
  

在C中,数组并未真正传递给函数。

详细信息:请使用以下内容。数组cap形式参数vertcalHistogram()。 C不传递数组,而是将数组转换为第一个元素的地址和类型。该实际参数传递给函数。该函数接收地址cap2[]

vertcalHistogram( cap, 26);  // good