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);