【问题标题】:about pointer in c language in GCC,Linux environment关于GCC,Linux环境下c语言中的指针
【发布时间】:2015-10-31 16:34:46
【问题描述】:

在下面给出的c代码中,我声明了一个整数指针但未初始化意味着它是野指针,所以当我尝试取消引用它时,它应该给出分段错误。但它没有给出SAG.FAULT,为什么?

(在linux环境下使用gcc编译器)

/*not giving segmentation fault*/
#include<stdio.h>
int main()
{
 int *p  ;

 printf("%p\n",p);
 printf("%p\n",*p);

return  0;
}

如果我用某个值初始化该指针,它会给我下面给出的代码中的分段错误

/*it is giving segmentation fault*/
#include<stdio.h>
int main()
{
 int *p =12444 ;

 printf("%p\n",p);
 printf("%p\n",*p);

return  0;
}

【问题讨论】:

  • 您应该知道一个指针指向某个内存位置,而您尝试分配给它的数字是非法的,因为您没有为该指针分配一些内存 (*p)。
  • 试试这个 gcc -Wextra -Werror -Wstrict-prototypes -Wconversion --std=c11 -O0 -g program.c -o program this is what you need
  • 顺便说一下 *p 的内容是用 %d 打印的,而不是像当你尝试打印它的地址时那样用 %p 打印的。
  • 由于内存位置是整数,最好使用 unsigned int ...使用 %u 而不是 %p
  • @ch3rub7 真的吗?如果数字变成 -25 怎么办?

标签: c linux pointers gcc dereference


【解决方案1】:
int *p

声明一个指向整数的指针。取消引用它不会给您带来段错误,因为它指向某个未知位置。

int *p = 12444; 

这个说法是错误的。指向整数的指针用于保存整数的地址。所以你基本上是通过将随机数分配给非法的指针来滥用该功能。

例如,

实际使用应该是

int a;   // Declare a variable
int *p;  // Declare a pointer
p = &a   // Initialize p with the address of a

【讨论】:

  • 简短的回答应该是,在您实际尝试将其分配给该数字之前,该指针应指向某个内存位置。
猜你喜欢
  • 2018-09-02
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多