我正在学校学习C,我正面临一个指针问题,为什么这个未处理的错误会增加(我在64位Windows 10上使用visual studio 2013 express for desktop),当我尝试运行下面的代码时。
我的问题是,为什么会发生这种情况?
代码阻止:
// ~~ Libraries Or Header Files. ~~ //
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// ~~ Main Function ~~ //
int main(void)
{
// ~ Variables ~ //
int * p = NULL;//#define NULL ((void *)0)
printf(*p);
//printf(p)l also raises an error.
// ~ END ~ //
system("PAUSE");
return 0;
}
错误:的
“hwQ3.exe中0x009A3C2A处的未处理异常:0xC0000005:访问冲突 读取位置0x00000000“。
答案 0 :(得分:1)
printf(...)的第一个参数是一个const char *格式,所以在这两种情况下你都试图取消引用NULL指针。这会导致您访问超出允许范围的内存(零)。
答案 1 :(得分:1)
此代码存在两个问题。
首先,printf
期望它的第一个参数是格式字符串,并且参数的类型被假定为const char *
(它是指向它的指针)零终止字符串中的第一个字符)。由于对象p
的类型为int *
,因此表达式 *p
的类型为int
,因此它的类型错误,并且*p
的值不是字符串的有效地址,因为......
您已将p
初始化为NULL
。 NULL
是一个无效指针值,保证比较不等于任何有效指针值(它定义明确&#34;无处&#34;值) 。当你写*p
时,你会说,&#34;我希望整数对象p
的值指向。&#34;由于p
指向&#34;无处&#34;,操作的行为是 undefined ,并且未定义行为的一种可能结果是段错误。
因此...
如果要打印p
指向的整数对象的值,您可以编写类似
printf( "%d\n", *p );
在p
上进行完整性检查后,但仅,以确保它不是NULL
:
if ( p ) // or p != NULL
printf( "%d\n", *p );
有效的指针值可通过以下方法之一获得:
&
运算符(一个表达内存中对象的表达式,以便可以读取或更新对象): p = &x; // x is an integer object
p = &a[i]; // a is an array of integer, so a[i] is an integer object
p = &foo.bar; // foo is a struct with an int member named bar, so foo.bar is an integer object
等等
malloc
,calloc
或realloc
之一:
p = malloc( sizeof *p );
sizeof
或一元&
运算符的操作数,或者是用于初始化声明中的字符数组的字符串文字,否则类型为&#的表达式 34; T
&#34;的N元素数组;将被转换(&#34;衰减&#34;)到类型为&#34的表达式;指向T
&#34;的指针,并且表达式的值将是第一个元素的地址。阵列。在printf
的情况下,当我们写作时
printf( "this is a test\n" );
字符串文字"this is a test\n"
的类型是从类型&#34; 16元素数组char
&#34;转换而来的。指向char
&#34;的指针,其值是字符串中第一个字符的地址 - 该地址值实际传递给printf
。
答案 2 :(得分:0)
有关指针的基本信息:
指针是声明一个指针变量,将其设置为指向某处,最后操纵它指向的值。一个简单的指针声明如下所示:
int *ip;
使用address-of'' operator &, which we can also think of as the
指针指向'运算符生成指针。通过声明(并初始化)一个int变量i,然后将ip设置为指向它来证明这一点:
int i = 5;
ip = &i;
指针使用示例:
#include <stdio.h>
int main(){
int var =10;
int *ptr = &var;
printf("%d\n", *ptr);
return 0;
}
将指针推迟到NULL时会发生什么?
int *a = NULL; // a is a null pointer
int b = *a; // CRASH: dereferencing a, trying to read it
*a = 0; // CRASH: dereferencing b, trying to write it