我的C程序包含一个名为' test_var'的数组。它有另一个整数数组' arr_int'它由一组整数组成。我的代码看起来像这样:
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
int State(var);
int main()
{
int arr_int[3] ={1000, 1001, 1002, 1003};
int var;
int *test_var[4]={0};
State(var)
{
int i;
for(i=0; i<4; i++){
test_var[i] = arr_int[i];
i++;
}
return test_var[var];
}
printf("Enter a number between 0 and 3\n");
scanf("%d",&var);
State(var);
printf ("The array structure is %d", test_var[var]);
return 0;
}
但是现在当我尝试为用户输入var = 0而不是整个数组(1000)打印返回值数组test_var时,我只得到0.我在这里做错了什么?有人请告诉我吗?我是否以错误的方式取消引用数组?
编辑:没有拼写错误的代码:
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
int State(var);
int main()
{
int *arr_int[3] ={1000, 1001, 1002, 1003};
int var;
int *test_var[4]={0};
State(var)
{
int i;
for(i=0; i<4; i++){
test_var[i] = arr_int[i];
i++;
}
return test_var[var];
}
printf("Enter a number between 0 and 3\n");
scanf("%d",&var);
State(var);
printf ("The array structure is %d", test_var[var]);
return 0;
}
答案 0 :(得分:1)
在你的情况下,
声明
test_var[i] = arr_int[i];
错了。 test_var[i]
类型为int *
,arr_int[i]
类型为int
,但它们并不真正兼容。引用标准,章节§6.3.2.3
整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。
然后,您正在使用其他声明,例如
printf ("The array structure is %d", test_var[var]);
%d
需要一个int
参数,但您提供的是int *
。纯undefined behaviour。
之后,int State(var)
依赖于默认为 - int
的旧概念,该概念在C99
之后已无效。
在包含3个元素的数组中,您将提供4个成员的初始化列表。无用而且令人困惑。
那就是说,FWIW,你使用的是嵌套函数,它也不是标准C. It is supported as a GCC extension的一部分。
修改强>
根据评论,即使您的arr_int
是int *
类型的数组,初始值设定项也不会为要解除引用的指针提供看似的有效值。这意味着,您无法访问这些指针所指向的内存,它们最有可能位于进程的已分配内存区域之外,因此无效。
尽管如此,对于前面提到的第2点,代码是UB。
答案 1 :(得分:0)
int arr_int[3] ={1000, 1001, 1002, 1003};
数组的大小为3
,您可以使用4
元素对其进行初始化。
嵌套函数也应该会产生问题。它们在GNU C中作为扩展支持。
注意 - 虽然您可以在函数内部声明函数,但它不是嵌套函数。
当您输入0
和2
时,您的第二个代码似乎提供了正确的输出,但当输入为1
或3
时,它给出为{{1} }。当然它并没有按照预期行事。
答案 2 :(得分:0)
int *arr_int[3] ={1000, 1001, 1002, 1003};
int *test_var[4]={0};
为什么要声明指针而不是数组?为什么arr_int [3]用4个整数初始化?
应该是这样的。
int arr_int[3] ={1000, 1001, 1002};
int test_var[4]={0}