为什么我的程序显示数组地址而不是其内容?

时间:2015-08-04 14:41:15

标签: c arrays pointers

我的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;
          }

3 个答案:

答案 0 :(得分:1)

在你的情况下,

  1. 声明

    test_var[i] = arr_int[i];
    

    错了。 test_var[i]类型为int *arr_int[i]类型为int,但它们并不真正兼容。引用标准,章节§6.3.2.3

      

    整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。

  2. 然后,您正在使用其他声明,例如

    printf ("The array structure is %d", test_var[var]);
    

    %d需要一个int参数,但您提供的是int *。纯undefined behaviour

  3. 之后,int State(var)依赖于默认为 - int 的旧概念,该概念在C99之后已无效。

  4. 在包含3个元素的数组中,您将提供4个成员的初始化列表。无用而且令人困惑。

  5. 那就是说,FWIW,你使用的是嵌套函数,它也不是标准C. It is supported as a GCC extension的一部分。

    修改

    根据评论,即使您的arr_intint *类型的数组,初始值设定项也不会为要解除引用的指针提供看似的有效值。这意味着,您无法访问这些指针所指向的内存,它们最有可能位于进程的已分配内存区域之外,因此无效。

    尽管如此,对于前面提到的第2点,代码是UB。

答案 1 :(得分:0)

int arr_int[3] ={1000, 1001, 1002, 1003};

数组的大小为3,您可以使用4元素对其进行初始化。

嵌套函数也应该会产生问题。它们在GNU C中作为扩展支持。

注意 - 虽然您可以在函数内部声明函数,但它不是嵌套函数。

修改

当您输入02时,您的第二个代码似乎提供了正确的输出,但当输入为13时,它给出为{{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}