我对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");
}
}
答案 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的数组,0
到25
是有效的索引范围。
答案 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