这个问题在这里已经有答案了:

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

#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 编译它。

有帮助吗?

解决方案

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

其他提示

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

这有道理吗?:)

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

你的意思可能是:

int *n = 新 int(5);

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

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

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

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

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

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

  exit(0);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top