C指针的疑惑(函数传址调用,如果传递的指针没有初始化会怎么样?)

原创 2010年01月07日 21:34:00

有下列简单的C程序,想一想程序运行的结果是什么?
#include<stdio.h>
#include<stdlib.h>
int *p;
//p=NULL    (1)
void test_p(int *p){
    p=(int *)malloc(sizeof(int));
    if(!p){
        perror("malloc faild/n");
    }else{
        printf("in test_p *p=%d/n“,*p=3);
    }
}
void init_p(){
    p=(int *)malloc(sizeof(int));
    if(!p){
        perror("in init_p malloc faild/n");
    }else{
        printf("in init_p p=%X *p=%d/n",(unsigned)p,*p=4);
    }
}
int main(){
    test_p(p);
    if(!p){
        printf("after executed test_p p is NULL/n");
    }else{
        printf("after executed test_p *p=%d/n",*p=4);
    }
    return 0;
}

1)    输出结果是:
    in test_p *p=3
    after executed test_p p is NULL
    为什么?
2)    如果我将//p=NULL的注释去掉,编译能够通过吗?
    不能!
3)    修改main函数中的if...else代码块为
    printf("p is %X/n",(unsigned)p);
    输出为p is 0,在大多数编译器中,都使用0来表示NULL。
4)    如果不掉用test_p而调用init_p呢?
    显然结果是在init_p内外p都被初始化了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

warning C4150: 删除指向不完整“XXX”类型的指针;没有调用析构函数

warning C4150:

C/C++函数形参传实参时值传递、指针传递、引用传递的区别

值传递:形参是实参的副本(复制、拷贝),形参值的改变不会影响实参的值,这种方式是很常见的。 指针传递:形参是指针类型,形参作指针运算后指向的就是实参,所以会影响实参的值。这种方式也是很常见的。 引用传...

C/C++—— 在构造函数中调用虚函数能实现多态吗(Vptr指针初始化的过程分析)

问题引入:比如:如果我们想在父类的构造函数中调用虚函数,当定义子类对象的时候,父类的构造函数中的虚函数执行的是子类中的函数。

C专家编程 十五 使用指针向函数传递一个多维数组

使用上一节所描述的笨拙方法,可以解决标记数组范围这个难题。但是还存在一个问题, 就是如何在函数内部声明一个二维数组参数,这才是真正的麻烦所在。C语言没有办法表达 “这个数组的边界在不同的调用中可以变化...

C函数传递结构体指针 题目地址:http://ac.jobdu.com/problem.php?id=1061

/* 题目描述: 有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序, 并输出N个学生排序后的信息。 输入...

【从C到C++学习笔记】引用/const引用/引用传递/引用作为函数返回值/引用和指针的区别

C/C++函数指针传递和typedef的误区

typedef string *pstrType; const pstrType cstrVar; 请问cstrVar是什么类型?简单的回答是const pstrType,那么这个类型是什么呢? ...

C函数的指针传递问题

转载自哪里忘了 前几日用C编写DSP程序时,遇到一个问题:如何向C函数中传递指向二维数组的指针参数。初接触以为很简单,直接声明一个二维数组,然后把数组名传进去。但是一经编译便报错。后来仔细想了一下,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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