这段提示翻译(意译)成中文是这样的:
【警告】传递的第3个参数“minA”将整数类型(integer)的数据当做指针(pointer)类型来使用,但这个转换并没有进行转换【默认是允许这样造作的】。
也就是说题主在函数参数传递时将整形数据直接传给了需要接受指针类型的参数,比如下面这个例子:
----------arguments。
c----------
#include
// 此函数直接打印指针的地址
void print_addr(int *ptr) {
? ?printf("The addr is %p。
", ptr);
}
int main(void) {
? ?int num = 100;
? ?
? ?// 此处是一个错误的示例
? ?// 将int num当做实参传递给函数print_addr()
? ?// 这是因为print_addr()的参数是int *而不是int
? ?print_addr(num);
? ?
? ?// 正确的调用方式如下:
? ?// 取得int num的地址后传递给print_add()
? ?// 如此才能获得争取的结果
? ?print_addr(&num);
? ?
? ?return 0;
}
将int直接当做int *或指针明明可能有误,但是为什么还会被允许呢?这是因为在C语言中long、int、char、short、byte、指针类型(当然也包括它们之间,它们与unsigned关键字之间的组合。
比如long long类型)都被叫做“整数类型”,也就是说这些类型在设计时都是用于保存“整数”的。而且,无论是哪种软硬件平台,无论是哪种操作系统,C语言编译器中的int类型数据的保存空间总是与指针类型相同!所以,int类型与指针(不论是指向何种类型,一维、二维还是更多维度的)类型其实只是通过编译器进行了类型的区分,使用int完全可以存储指针类型的数据(并且也真有这么使用的)!
这样设计的好处是使用灵活。
毕竟C语言的设计初衷就是给“专业人士”使用的高效工具。设计者认为既然使用C语言的人都是专家,所以这些类型之间的相互关系和转换都需要自行检查清楚。
这样设计的缺点也很明显。无论是新手还是老手,只要稍有不注意都可能会出现意想不到的结果。
所以,我们在使用C语言编译器调试程序时一定要尽可能多的查看警告信息并引起注意。比如在使用GNU gcc或MinGW编译器时,建议使用下面这种方式进行编译检查:
~> gcc -Wall -g -c argments。c
这样就可以加入调试信息(-g)以及获得最多的警告信息(-Wall)。
要知道,很多时候警告信息就是隐藏得更加深入的错误。当然,没有警告和错误提示也不代表没有问题,这只能说明没有语法错误而已。真正可怕的还是逻辑错误,而这就需要你使用类似于gdb这样的调试工具进行细心、有技巧的分析和查询了。
全部