int * p = 10怎么样;工作?

时间:2016-02-16 09:03:01

标签: c

我有一份声明int *p = 10;。这个语句在任何编译器上执行都很好。我也知道10被放入只读存储器中。有没有办法可以访问这个内存。如何在控制台上打印?声明printf("%d",*p)崩溃了。如何在控制台上打印。

修改

int main()
{
   int *p = 10;
}

上面的代码编译得很好并且运行正常。

int main()
{
    int *p = 10;
    printf("\n%d",*p); //crashes
}

上面的代码给出了分段错误。我想知道更多关于此的解释吗?

6 个答案:

答案 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;

或通过调用返回指针值的函数,例如mallocfopen。某些平台可能会公开特定操作的特定地址,但这些平台通常都有详细记录,而且地址值不是很低。