代码之家  ›  专栏  ›  技术社区  ›  randombits

C指针初始化和取消引用,这里怎么了?[复制品]

  •  1
  • randombits  · 技术社区  · 15 年前

    这应该是非常简单的,但我不知道为什么编译器在这里抱怨。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      int *n = 5;
    
      printf ("n: %d", *n);
    
      exit(0);
    }
    

    收到以下投诉:

    foo.c:在函数__main_
    Fo.C: 6: 警告:初始化生成指针 不带强制转换的整数

    我只想打印指针n引用的值。我在printf()语句中取消对它的引用,得到了一个分段错误。用gcc-o foo foo.c.编译这个。

    4 回复  |  直到 15 年前
        1
  •  7
  •   sth    15 年前

    设置指向内存地址的指针 5 ,以便它指向地址处的任何内容 可能是。你可能想指出一个地址 存储。例如:

    int v = 5;    // Store the value 5 in a normal variable
    int *n = &v;  // Make n contain the address of v, so that it points to the 
                  // contents of v
    
        2
  •  3
  •   stuck    15 年前

    您将n设置为虚拟内存地址5,因为此内存对您的应用程序无效,您将遇到崩溃。

    您需要做的是首先获得一些有效的内存,您有两个选项-使用堆栈或使用堆。

    如果您执行下面的操作,您将“指向”一个堆栈变量,然后可以在其中指定值5

    int stackVar = 0;
    int *n = &stackVar;
    *n = 5;
    

    堆栈和堆之间的区别在于内存来自何处-堆栈变量仅在函数调用的生命周期内存在。当函数返回时,栈变量将被“弹出”,这些内存片段将不再有效。--因此,从上面的示例中,您只能在“stackvar”存在的情况下使用“n”,在本例中,直到您从函数返回时为止。

    如果你准备好了

    int *n = (int *)malloc(sizeof(int));
    *n = 5;
    

    您将创建一个大小为sizeof(int)字节的“heap”变量。此变量将持续到调用“free”为止。

    free(n);
    

    请记住,这样做有点重,因为调用“new”时会创建额外的簿记内存。不会太多,但它会在那里。通常,您将从堆中分配更大的类/结构。使用堆的一个额外负担是您必须记住删除,否则您将“泄漏”。我敢肯定你以前见过这些:你运行应用程序的时间越长,它使用的内存就越多。

    这有道理吗?:)

        3
  •  2
  •   Brendan Long    15 年前

    因为您将指针的值设置为“5”(如内存地址5)。

    你可能是说:

    int*n=新int(5);

    int *n = malloc(sizeof(int));
    *n = 5;
    

    malloc() 返回一个内存地址,这是您想要设置指针的地方。

        4
  •  0
  •   semaj    15 年前

    您需要将指针设置为值的地址…

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      int value = 5; 
      int *n = &value;
    
      printf ("n: %d", *n);
    
      exit(0);
    }