请查看以下代码段 -
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
提前致谢。
答案 0 :(得分:3)
- 虽然第一个代码在执行时失败,但为什么它没有给出编译错误,而不是警告?
醇>
错误和警告之间的区别取决于传递给编译器的标志。
在开发期间(-Wall
,-Wextra
,甚至可能使用-Weverything
与Clang)使设置更加偏执是一个好主意,此外还要通过{{1来警告错误(在发送代码时,您可能不应该默认设置)。
- 我们可以像这样初始化和声明指针变量
醇>
指针变量存储地址,您需要声明一个可以存储值的可寻址的东西。
从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)
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
选项将错误报告为错误。