1

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

#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

4 回答 4

7

您将指针设置为 memory address 5,以便它指向 address5可能的任何内容。您可能想让它指向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
于 2010-06-10T23:58:52.537 回答
3

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

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

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

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

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

如果你要设置

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

您将创建一个 sizeof(int) 字节大的“堆”变量。此变量将持续到您调用“免费”

free(n);

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

这有意义吗?:)

于 2010-06-10T23:59:01.803 回答
2

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

你可能的意思是:

int *n = 新的 int(5);

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

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

于 2010-06-10T23:56:02.520 回答
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);
}
于 2010-06-11T00:00:37.197 回答