我有一份声明int *p = 10;
。这个语句在任何编译器上执行都很好。我也知道10被放入只读存储器中。有没有办法可以访问这个内存。如何在控制台上打印?声明printf("%d",*p)
崩溃了。如何在控制台上打印。
修改
int main()
{
int *p = 10;
}
上面的代码编译得很好并且运行正常。
int main()
{
int *p = 10;
printf("\n%d",*p); //crashes
}
上面的代码给出了分段错误。我想知道更多关于此的解释吗?
答案 0 :(得分:8)
输入int *p = 10;
,你对编译器说:
让我们在整数上有一个指针,称为“p”。 将p设置为10 =>内存地址10上的点。
输入printf("%d",*p);
,你对编译器说:
告诉我 - 一个整数 - 内存上的地址10是什么。
代码
int *p = 10;
相当于:
int *p;
p = 10;
不等同于:
int *p;
*p = 10;
更正后的代码可能是:
// define an integer
int i;
// define a pointer on the integer
int *p = &i;
// set integer to 10, through pointer
*p = 10;
// display integer through pointer
printf("%d",*p);
答案 1 :(得分:1)
我认为我的回答对你很有帮助,你可能会误解指针的定义并以错误的方式使用指针。让我们先分析你的代码:
int *p = 10
这个语句定义了一个指向内存中地址10的指针,它编译正常,因为没有语法错误 - p的内容是地址10,但你不知道是什么' s地址10中的值,并且它通常没有内部存储器来存储一个值,因为你没有为它分配内存。你也想要使用系统内存非常危险10
您可以打印p:
指向的地址printf("%d\n", p);//p is pointed to address 10
所以当你试图打印p的内容时:
printf("\n%d",*p);
没有分配内存来存储内容,发生分段错误!
如果你想直接为指针赋值,你必须先为它动态应用内存空间,你应该这样写:
int *p = NULL;//the right and safe habit to define a pointer
p = (int *)malloc (sizeof(int));//dynamic application of memory space of pointer p to store value
if (NULL == p)
{
printf("malloc failed!\n");//show error
exit(1);//exit
}
*p = 10;//now you have memory space to store value 10
printf("%d\n", *p);
free(p);//release the memory to avoid memory leaks
p = NULL;//the right and safe habit
您也可以这样写:
int transfer_value = 10;//integer has memory when you declare it
int *p = &transfer_value;//p stores the address of i which content is value 10
printf("%d\n", *p);//because variable i has memory which size is sizeof(int), you can print *p(it stands for the value of i)directly.
希望我的解释可以帮助你^ _ ^
答案 2 :(得分:1)
存在内存访问冲突时,分段错误是错误。动态内存分配将解决您的问题。内核将决定应该使用哪个内存地址来存储值。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p = malloc(sizeof(int)); //Kernel will assign a memory from Heap segment
*p=10;
printf("\n%d",*p);
free(p);
}
答案 3 :(得分:0)
您已创建指针,而非值。你可能只想要int i = 10。否则,程序正在访问地址10处的随机存储器并将崩溃。
答案 4 :(得分:0)
将值10指定给指针时,实际上会为其指定地址 10。初始化时,您不会收到任何错误,但是当您尝试打印它时,您必须访问它,并且您无权访问此内存地址(这就是您出现分段错误的原因)。
如果你这样做:
int i = 10;
int *ptr = &i;
printf("%d\n", *ptr);
它会起作用,因为你使指针指向包含值10的变量i
。
答案 5 :(得分:0)
int *p = 10;
创建指针p
并将其设置为指向内存地址 10
,这很可能不是您平台上的可访问地址,因此崩溃printf
声明。
有效指针是通过在另一个对象上使用一元&
运算符获得的,例如
int i = 10;
int *p = &i;
或通过调用返回指针值的函数,例如malloc
或fopen
。某些平台可能会公开特定操作的特定地址,但这些平台通常都有详细记录,而且地址值不是很低。