C 错误调用对象不是函数或函数指针
我这段简单的代码有一个错误。我不明白为什么C 错误调用对象不是函数或函数指针,c,function,C,Function,我这段简单的代码有一个错误。我不明白为什么 #include <stdio.h> #include <stdlib.h> int main(int argc, char ** argv){ int buffer[4]={1,2,3,4}; int** Matrix; Matrix=Matrix(buffer); } int** Matrix(int* buffer){ int ** Matrix; Matrix= malloc
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char ** argv){
int buffer[4]={1,2,3,4};
int** Matrix;
Matrix=Matrix(buffer);
}
int** Matrix(int* buffer){
int ** Matrix;
Matrix= malloc(sizeof(buffer)*sizeof(buffer));
int j,i;
for(j=0;j<sizeof(buffer)/sizeof(int);j++){
for(i=0;i<sizeof(buffer)/sizeof(int);i++){
Matrix[j][i]=buffer[i];}}
return Matrix;
}
#包括
#包括
int main(int argc,字符**argv){
int缓冲区[4]={1,2,3,4};
int**矩阵;
矩阵=矩阵(缓冲器);
}
整数**矩阵(整数*缓冲区){
int**矩阵;
矩阵=malloc(sizeof(缓冲区)*sizeof(缓冲区));
int j,i;
对于代码中的(j=0;j,您得到了一个具有相同名称(标识符)的变量和函数
引用C11
,第§6.2.1章,标识符范围
[…]如果标识符以相同的名称指定两个不同的实体
如果是,则一个实体的作用域(内部作用域)将结束
严格在其他实体的范围之前(外部范围)。在内部范围内
标识符指定在内部范围中声明的实体;在外部范围中声明的实体
范围在内部范围内隐藏(不可见)。
现在,在main()
内部,变量Matrix
位于局部范围内,它优先于(flie scope)函数名(也就是Matrix
),因此该函数在main()
中不可见,从而导致错误
更改其中一个标识符以使它们都唯一
另外,正如在另一个答案中正确提到的,如果函数在定义之前已经使用过,编译器将无法知道函数返回类型和参数的详细信息
- 将函数定义移到
main()之前
- 在
main()
有两个错误:
- 具有相同名称的变量和函数
Matrix
- 函数矩阵位于主函数之下,但gcc无法建立函数矩阵的链接。它没有标识函数。将矩阵函数置于主函数之上
大体上
int main(int argc, char ** argv){
int buffer[4]={1,2,3,4};
int** Matrix;
Matrix=Matrix(buffer);
}
名称矩阵声明为like的局部变量
int** Matrix;
在语句中引用自身
Matrix=Matrix(buffer);
for(j=0;j<sizeof(buffer)/sizeof(int);j++){
然而这句话
Matrix(buffer)
sizeof(buffer)/sizeof(int)
在C中对指针无效
显然,您指的是具有相同名称矩阵的函数。但在使用它之前,必须至少在全局命名空间中声明它。此外,局部变量将隐藏函数的名称
因此,应该为指针和函数使用不同的名称
#include <stdio.h>
#include <stdlib.h>
int** Matrix(int* buffer);
int main(int argc, char ** argv){
int buffer[4]={1,2,3,4};
int** m;
m = Matrix(buffer);
}
int** Matrix(int* buffer){
//... the body of the function
}
可能等于2或1,这取决于sizeof(int*)
是否等于8或4,以及相应的sizeof(int)
也等于8或4。在C中尝试用相同的名称命名变量和函数通常是不明智的。错误是编译错误、编译警告还是算法错误?我们很难猜测,大多数人可能会跳过这个问题,因为我们不知道您期望的是什么。告诉我们什么t表示问题,以及您可能拥有的任何输入和(非)预期输出。我的意思是函数矩阵返回一个int**并且我的对象矩阵也是int**类型。为什么gcc说它不是函数或函数指针,但gcc必须在main下没有函数。
您能引用一些东西吗?“…gcc必须在main下没有函数。”就目前情况而言,这是胡说八道。事实上,我的英语很抱歉。gcc不知道矩阵函数的返回类型。