这应该是超级简单的,但我不确定为什么编译器在这里抱怨。
#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。
编译它答案 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);
}