C指针初始化和解除引用,这里有什么问题?

时间:2010-06-10 23:53:21

标签: c pointers dereference

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

#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。

编译它

4 个答案:

答案 0 :(得分:7)

您将指针设置为内存地址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

答案 1 :(得分:3)

您将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'时会产生额外的簿记记忆。它不会太多,但它会在那里。通常,您将从堆中分配更大的类/结构。使用堆的一个额外负担是你必须记住删除,否则你'泄漏'。我相信你以前见过这些:-)你运行应用程序的时间越长,它使用的内存越多

这有意义吗? :)

答案 2 :(得分:2)

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

你可能意味着:

int * n = new int(5);

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

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

答案 3 :(得分:0)

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

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

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

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

  exit(0);
}