C 为什么动态创建变量时会出现未声明的标识符错误? 我注意到,当我在主()/函数中间声明变量时,我会出错,但是我认为动态创建变量不会造成错误,因为它可以在运行时随时随地执行(我知道)。
然而,我仍然得到:C 为什么动态创建变量时会出现未声明的标识符错误? 我注意到,当我在主()/函数中间声明变量时,我会出错,但是我认为动态创建变量不会造成错误,因为它可以在运行时随时随地执行(我知道)。,c,compiler-errors,C,Compiler Errors,然而,我仍然得到: error C2065: 'i' : undeclared identifier error C2065: 'z' : undeclared identifier error C2065: 'intArr' : undeclared identifier 我的代码: int main() { ..... ..... ..... printf("Type the array size:\t"); int *z = (int *)malloc(size
error C2065: 'i' : undeclared identifier
error C2065: 'z' : undeclared identifier
error C2065: 'intArr' : undeclared identifier
我的代码:
int main()
{
.....
.....
.....
printf("Type the array size:\t");
int *z = (int *)malloc(sizeof(int));
scanf("%d", z);
int *intArr = (int *)malloc((*z) * sizeof(int));
int *i = (int *)malloc(sizeof(int));
for (*i = 0; *i < *z; ((*i)++))
{
printf("Type a number\t");
scanf("%d", (intArr+(*i)));
}
printArr(intArr);
}
void printArr(int *arr)
{
int i;
for (i = 0; i < (sizeof(arr) / sizeof(*arr)); ++i)
printf("%d ", *(arr+i));
}
intmain()
{
.....
.....
.....
printf(“键入数组大小:\t”);
int*z=(int*)malloc(sizeof(int));
scanf(“%d”,z);
int*intArr=(int*)malloc((*z)*sizeof(int));
int*i=(int*)malloc(sizeof(int));
对于(*i=0;*i<*z;(*i)++)
{
printf(“键入数字\t”);
scanf(“%d”,(intArr+(*i));
}
printArr(intArr);
}
无效打印阵列(int*arr)
{
int i;
对于(i=0;i<(sizeof(arr)/sizeof(*arr));+i)
printf(“%d”,*(arr+i));
}
(我不知道@Blood为什么删除了他的答案;这基本上是正确的。)
当我使用gcc编译您的程序时,它编译时没有错误。我必须补充一点
#include <stdio.h>
#include <stdlib.h>
第10行:
printf("Type the array size:\t"); // line 9
int *z = (int *)malloc(sizeof(int)); // line 10
问题是1989/1990版本的C标准不允许在块中混合声明和语句;它要求首先显示所有声明,然后是所有语句。1999年的C标准改变了这一点,但微软的C编译器对超过1990年的任何C标准的支持都非常有限(他们说他们无意改变这一点)。(我希望它们可以允许将来版本中的混合声明和语句,因为这也是一个C++特性。)
(根据错误消息的形式,我假设您正在使用Microsoft编译器。)
您可以重新排列代码以满足Microsoft编译器的限制。在某些情况下,您可能需要更改以下内容
int *var = initial_value;
到
另一个与您的问题无关的建议:
在C语言中,不应该强制转换malloc()
的结果。malloc()
函数返回类型为void*
的值,该值可以隐式转换为指向对象类型的任何指针。(C++没有这个隐式转换,但是你不应该在C++中使用<代码> MalCube())<代码> >
与此相反:
int *z = (int *)malloc(sizeof(int));
...
int *intArr = (int *)malloc((*z) * sizeof(int));
你可以这样写:
int *z = malloc(sizeof *z);
...
int *intArr = malloc(*z * sizeof *intArr);
删除不必要的强制转换可以避免某些错误;例如,对于某些编译器,如果您忘记了所需的#include
,则强制转换可以屏蔽必要的错误消息。将sizeof
应用于*z
或*intArr
,而不是显式地命名大小,这意味着如果指针的类型发生更改,则不必更改调用。例如,如果您编写:
double *p = malloc(sizeof (int)); // incorrect
那么您分配了错误的大小,但是编译器不会警告您
此外,如果您使用malloc()
分配单个int
值,就像您使用i
和z
指针一样,您正在做不必要的工作。除非您的目的是练习使用malloc()
,否则您最好只进行i
和z
int
变量,然后放弃malloc()
调用。您只需将他们的地址传递给scanf
。换句话说,您可以更改以下内容:
int *z = (int *)malloc(sizeof(int));
...
scanf("%d", z);
为此:
int z;
...
scanf("%d", &z);
还有一点:您的程序没有错误检查<如果没有足够的内存分配,代码>malloc()可能会失败;发生这种情况时,它返回一个空指针(null
)scanf()
如果出现输入错误,或者在需要读取int
时键入hello
可能会失败scanf()
返回成功扫描的项目数;您应该验证它是否这样做(在本例中,它在成功时返回1)。对于这样的简单程序,中止程序时会显示错误消息:
fprintf(stderr, "Call to ... failed\n");
exit(EXIT_FAILURE);
可能已经足够好了。这是C89和C99标准之间的差异之一。MSVC不支持C99。汉斯说了些什么,但请注意,当将C文件编译为C文件时。编译所有东西,因为C++明显改变了。在MSVC编译器设置中,是否可以将C编译为C++或C.HANS,MSVC实际上支持所有的C89吗?我的印象是,它根本不支持C,只是C++的一个子集,微软坚持称之为“C”,但它确实只是一个简化的特征集。您是否必须动态分配
z
和i
?它们看起来像简单的大小和循环变量!2.如果你这样做,你也应该免费他们。3. <代码>类型*var=malloc(大小*sizeof(*var))代码>更难维护,因为你不会一遍又一遍地重复<代码>类型< /代码>。@沙赫巴兹我这样做是因为我认为它允许我在函数中间声明变量(但看起来它与它无关)谢谢你的回答,我从中学到了很多。我目前使用微软的Visual C++ 2010 Express。你认为我应该用GCC来编译我的代码吗?我喜欢在VisualStudio中编程。
int z;
...
scanf("%d", &z);
fprintf(stderr, "Call to ... failed\n");
exit(EXIT_FAILURE);