C 指针初始化和取消引用,这里出了什么问题?[复制]
-
26-09-2019 - |
题
这个问题在这里已经有答案了:
这应该非常简单,但我不确定编译器为什么在这里抱怨。
#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);
}