初始化和声明指针变量时了解警告和编译错误

时间:2015-04-01 18:39:15

标签: c++ c pointers

请查看以下代码段 -

int main(){

   int  *i_ptr = 5;
   printf("%d", *i_ptr); 

   return 0;
}

这里我试图声明并初始化一个指针变量i_ptr。它在编译好的时候给了我以下警告 -

  

警告:初始化使得整数指针没有强制转换   [默认启用]

但是当我要执行代码时,它会给我以下错误 -

  

分段错误(核心转储)

我知道这样做的正确方法 -

int n = 5;
int *ptr = &n;  

现在我有一些问题 -

1。虽然第一个代码在执行时失败,但为什么它不会给出编译错误而不是警告?

2. 我们可以像这样初始化并声明指针变量 -

int n = 5 // both declaration and initialization of int type variable n  

提前致谢。

6 个答案:

答案 0 :(得分:3)

  
      
  1. 虽然第一个代码在执行时失败,但为什么它没有给出编译错误,而不是警告?
  2.   

错误和警告之间的区别取决于传递给编译器的标志。

在开发期间(-Wall-Wextra,甚至可能使用-Weverything与Clang)使设置更加偏执是一个好主意,此外还要通过{{1来警告错误(在发送代码时,您可能不应该默认设置)。

  
      
  1. 我们可以像这样初始化和声明指针变量
  2.   

指针变量存储地址,您需要声明一个可以存储值的可寻址的东西。

从C99开始,可以使用复合文字而不是命名变量:

-Werror

答案 1 :(得分:2)

*在您的代码中有不同的含义。

它不是用于指针取消引用而是用于指针声明,因此您声明一个指针并为其指定一个整数,指针将整数存储为它指向的地址。

这可能是未定义的行为,因为您不知道5是否是有效地址,而且非常可能不是。

如果从初始化中拆分声明,很明显代码具有不同的含义,例如

int *pointer; /* here the `*' is used for pointer declaration */
int  value;

pointer  = &vaule; /* we store the address of value */
*pointer = 5; /* we dereference the pointer and write to that location */
/* ^ here the `*' is used for pointer dereference */

printf("%d\n", value * 5); /* this will print 25 */
/*                   ^ here the `*' is used for multiplication */

现在您看到我说您的代码令人困惑,因为

int *pointer = 5;

似乎相当于

*pointer = 5;

但事实并非如此。

答案 2 :(得分:1)

  1. int *n = 5在技术上没有任何问题。它是指向具有地址5的内存的有效指针,以及它为什么允许您编译它的原因。它是段错误的原因是你的程序无法访问这个内存。

答案 3 :(得分:1)

当你做的时候

int  *i_ptr = 5;

您要将地址5分配给i_ptr.But,因为此地址不属于您的程序,因此当您取消引用i_ptr时它会给您分段错误。只能尝试访问属于您的那个内存位置程序

答案 4 :(得分:1)

编译器不需要将其设为错误,因此不会。

您要查找的语法是:int *i_ptr = new int(5);

这为一个整数分配足够大的新内存,将值设置为5,并将i_ptr设置为指向该内存。记得在完成记忆后delete i_ptr;

答案 5 :(得分:1)

您的代码在C和C ++语言中都是非法的。您不能使用整数值初始化指针。此

int *i_ptr = 5;

是非法的。正如其他一些答案似乎暗示的那样,它不是“将地址5分配给指针”。在标准C和C ++语言的范围内,上述初始化显然是不可编译的。

您收到的诊断消息表示代码中存在错误。在那之后,C和C ++都不能保证代码的含义,即你的代码既不是C也不是C ++。

不要忽略编译器发出的诊断消息。 C和C ++没有区分“警告”或“错误”。任何诊断消息都应被视为潜在错误。由您来识别看起来像“仅仅是警告”的错误。使用GCC,您还可以尝试使用-pedantic-errors选项将错误报告为错误。