《程序员面试宝典》指针问题

原创 2015年07月07日 21:27:56

程序员面试宝典一书第7章,面试例题九,题目是问程序运行到哪一行会崩溃。

编写程序如下

#include <stdlib.h>
#include <stdio.h>
struct S
{
    int i;
    int *p;     
};

int main(void)
{
    struct S s;
    int *p = &s.i;    
    p[0] = 1;
    p[1] = 5;
    printf("%d %d\n", p[0], s.i);   //p = &s.i;   p[0] == s.i;
    printf("%p %p\n", &p[0], &s.i);
    printf("%d %d\n", p[1], s.p);   //p = &s.i;   p[1] == s.p;
    printf("%p %p %p\n", &p[1], &s.p, &s.p[1]);
    s.p = p;                        //p = &s.i -> s.p == p == s.i  
    printf("%d %d\n", p[0], s.i);
    printf("%p %p\n", &p[0], &s.i);
    printf("%d %d %d\n", p[1], s.p, s.p[1]);   //s.p[1] == *(&s.i + 1), 即s.i的地址加1,即为s.p。 
    printf("%p %p %p\n", &p[1], &s.p, &s.p[1]);
    s.p[1] = 1; 
    printf("%d %p %p\n", s.p, &s.p, &s.p[1]);   //s.p == s.p[1]  但是s.p[0] != s.i    //*s.p 相当于s.p[0],都是未作声明的地址,访问会出错。 
    system("pause");
}

运行结果:


以下程序会崩溃,主要原因是对一个未作声明的地址访问,会出错。

s.p[0] = 2; //程序崩溃;
*s.p = 2; //s.p[0] 相当于*s.p
指针和数组访问是很灵活的,需要特别注意容易出错。

相关文章推荐

关于指针与类的内存分布问题(问题思考来自《程序员面试宝典》)

引起思考的例子: class A { public: int a_1,a_2; A() :a_1(1),a_2(2){} void func() { cout ...

程序员面试宝典笔记2--指针和引用

1.this指针 2. a) int a b)...

19.c/c++程序员面试宝典-this指针

19.c/c++程序员面试宝典-this指针

18.c/c++程序员面试宝典-函数指针

18.c/c++程序员面试宝典-函数指针

程序员面试笔试宝典——读书笔记2、内存分配、sizeof、指针

二、内存分配 1、内存分配的形式有哪些? 一个C/C++编译的程序所占用的系统内存一般分为以下几个部分的内容: a、有符号起始的区块(BBS, Block Started by Symbol)段...
  • Cowena
  • Cowena
  • 2015年08月27日 15:56
  • 714

由一道程序员面试宝典引出的问题-printf如何读入浮点数!

在讲这个题目之前,预备知识,讲一下,printf函数,输入参数是读入缓冲区保存,再按照%?的格式从缓冲区中读出数据,并据此格式解释数据。有了这个知识之后,在讲程序员面试宝典上看到一个题:view pl...
  • wxhhkhl
  • wxhhkhl
  • 2011年01月08日 13:48
  • 348

程序员面试宝典8.2典型递归问题

今天看书看到8.2的递归问题,

【程序员面试宝典】递归之两个字符串连接次序问题(P83)

题目: 输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序。即输出125、126、145、146.   解决方案: 此处仅考虑第一个字符串中的字符在第二个字符...
  • yahohi
  • yahohi
  • 2012年08月28日 22:09
  • 1345

程序员面试宝典之数据结构基础----循环链表(约瑟夫环问题)

关于循环链表,即单链表的为指针指向头结点,当然在建立循环链表的时候可以将链表的为指针指向头结点,但本例用的是先建立一个只有一个节点的循环链表(即next指针指向自己结点),然后再在此循环链表中插入节点...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《程序员面试宝典》指针问题
举报原因:
原因补充:

(最多只允许输入30个字)