void main()
{
int *p=20;
printf("%d\n",*p);
}
这段代码编译成功但是给出了分段错误,我正在使用gcc编译器。
答案 0 :(得分:3)
您将p
定义为指向内存地址20的指针。然后,在使用*p
语法时,尝试取消引用该地址。地址20不太可能在您允许访问的内存范围内,因此它会给您一个分段错误。
char* i = "abcd";
告诉编译器在内存中为字符串留出空间,并将i
指向内存中的那个位置。您仍在将内存中的位置分配给变量。
*i
中的printf
表示您想要i
指向的值。在您的评论中,您实际上不会获得abcd
,您实际上会获得a
。这是因为i
指向字符串"abcd"
中的第一个字符,该字符为a
。
如果您想要一个如何指向整数的示例,请查看以下代码:
#include<stdlib.h>
#include<stdio.h>
int main() {
int number = 5; //A space in memory, set to the value 5
int* pointer = &number; //A pointer to point to the space in memory
printf("%d\n", *pointer); //Using * to get the value pointed to by pointer
return 0;
}
答案 1 :(得分:3)
我认为你在考虑
int *p=20;
将整数值20转换为指针P,但事实并非如此。
您实际上是将poinetr值初始化为地址20。 并且在print语句中,您将取消引用您可能无权执行的操作。
尝试使用以下代码
void main()
{
int a=20
int *p=&a;
printf("%d\n",*p);
}
答案 2 :(得分:2)
指针p
指向可能不属于您的地址20
。 printf
调用将尝试打印该内存的内容,这是不允许的。