打印指针会引发运行时错误

时间:2017-03-24 13:20:00

标签: c pointers

我正在学校学习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“。

3 个答案:

答案 0 :(得分:1)

printf(...)的第一个参数是一个const char *格式,所以在这两种情况下你都试图取消引用NULL指针。这会导致您访问超出允许范围的内存(零)。

答案 1 :(得分:1)

此代码存在两个问题。

首先,printf期望它的第一个参数是格式字符串,并且参数的类型被假定为const char *(它是指向它的指针)零终止字符串中的第一个字符)。由于对象p的类型为int *,因此表达式 *p的类型为int,因此它的类型错误,并且*p不是字符串的有效地址,因为......

您已将p初始化为NULLNULL是一个无效指针值,保证比较不等于任何有效指针值(它定义明确&#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
    
    等等
  • 致电malloccallocrealloc之一:
        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