我有一个错误的简单代码。我不明白为什么。
#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;
}
编译此代码会产生错误
称为对象的错误不是函数或函数指针
答案 0 :(得分:2)
主要
int main(int argc, char ** argv){
int buffer[4]={1,2,3,4};
int** Matrix;
Matrix=Matrix(buffer);
}
名为Matrix的局部变量声明为
int** Matrix;
在声明
中引用自身 Matrix=Matrix(buffer);
然而这个表达
Matrix(buffer)
对于指针,在C中无效。
很明显,您的意思是具有相同名称Matrix的功能。但在使用它之前必须至少在全局命名空间中声明它。而且局部变量将隐藏函数的名称。
因此,您应该为指针和函数使用不同的名称。
#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
}
考虑到功能本身也是不正确的。例如,在本声明中
for(j=0;j<sizeof(buffer)/sizeof(int);j++){
sizeof(buffer)并不意味着用作参数的数组的大小。它意味着int *
类型指针的大小
因此,例如表达式
sizeof(buffer)/sizeof(int)
可能等于2或1,具体取决于sizeof( int * )
是否等于8或4,相应地sizeof( int )
也等于8或4。
答案 1 :(得分:1)
在您的代码中,您有一个变量和一个具有相同名称(标识符)的函数。
引用C11
,章节§6.2.1,标识符范围
[...]如果标识符指定同名的两个不同实体 空间,范围可能重叠。如果是这样,一个实体(内部范围)的范围将结束 严格地在另一个实体的范围之前(外部范围)。 在内部范围内, identifier指定在内部作用域中声明的实体;在外部宣布的实体 范围在内部范围内隐藏(并且不可见)。
现在,在main()
内,变量Matrix
在本地范围内,它优先于(flie scope)函数名称(也是Matrix
),因此函数不是<来自main()
的em> visible 会导致错误。
更改任一标识符以使它们都是唯一的。
另外,正如TZof在另一个答案中正确提到的那样,如果函数在定义之前已经使用,编译器无法知道函数返回类型和参数详细信息。做任何一件事
main()
main()
之前添加forward declaration函数。答案 2 :(得分:0)
有两个错误:
Matrix