用gcc指针分割错误

时间:2012-08-08 08:22:50

标签: c pointers

void main()
{ 
    int *p=20;
    printf("%d\n",*p);
}

这段代码编译成功但是给出了分段错误,我正在使用gcc编译器。

3 个答案:

答案 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指向可能不属于您的地址20printf调用将尝试打印该内存的内容,这是不允许的。