【问题标题】:C pointer initialization and dereferencing, what's wrong here? [duplicate]C指针初始化和取消引用,这里有什么问题? [复制]
【发布时间】:2011-03-02 10:51:58
【问题描述】:

这应该超级简单,但我不确定编译器为什么在这里抱怨。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int *n = 5;

  printf ("n: %d", *n);

  exit(0);
}

收到以下投诉:

foo.c:在函数'main'中:
foo.c:6: 警告:初始化使指针 从没有强制转换的整数

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

【问题讨论】:

    标签: c pointers dereference


    【解决方案1】:

    您将指针设置为内存地址5,以便它指向地址5 上的任何内容。您可能想让它指向存储值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】:

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

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

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

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

    栈和堆之间的区别在于内存的来源——栈变量只在函数调用的生命周期内存在。当函数返回时,堆栈变量被“弹出”并且这些内存不再有效。 -- 所以从我上面的例子中,只要有 'stackVar' 存在,你就只能使用 'n',在这种情况下,直到你从你的函数返回。

    如果你要设置

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

    您将创建一个 sizeof(int) 字节大的“堆”变量。这个变量会一直持续到你调用'free'

    free(n);
    

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

    这有意义吗? :)

    【讨论】:

    • 对 C/C++ 的良好调用,我的错误修复
    【解决方案3】:

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

    你的意思可能是:

    int *n = new int(5);

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

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

    【讨论】:

    • 为什么这被否决了?我很困惑。
    • 我对 ANSI C 何时添加 new 感到很困惑。
    【解决方案4】:

    你需要将指针设置为一个值的地址...

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

    【讨论】:

      猜你喜欢
      • 2019-10-28
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 2020-07-22
      相关资源
      最近更新 更多