edgar1989 发表于 2013-5-23 22:45:12

C语言指针问题请教

各位大侠,小弟我有一段程序编译出错,错误为:非法间接寻址
#include<stdio.h>
void fun(void * addr)
{
        void * plink;
        plink = addr;
        printf("plink = %d , *plink = %d\n" , plink , *plink);
}

void main()
{
        int a = 1;
        int *pa;
        pa = &a;
        printf("a = %d , pa = %d\n", a , pa);
        fun(pa);
        getchar();
}

若将上述fun函数形参void指针改为int型 和 pink改为int型,则不会报错;

各位大侠请问是桌面回事??求解?

lcofjp 发表于 2013-5-23 22:53:42

void型的指针是不能解引用的,即*plink,void即未知类型,无类型,你这样使用,编译器就蒙了。
正确方法是把指针强制类型转换成其他明确的类型之后再解引用,例如:*(int*)plink;

edgar1989 发表于 2013-5-23 23:22:05

lcofjp 发表于 2013-5-23 22:53 static/image/common/back.gif
void型的指针是不能解引用的,即*plink,void即未知类型,无类型,你这样使用,编译器就蒙了。
正确方法是 ...

很感谢您的回答,容我在追问一下:若我将函数fun改为:
void fun(void * addr)
{
        void ** plink;
        plink = (void **)addr;
        printf("plink = %d , *plink = %d\n" , plink , *plink);
}
编译可以通过。那么是不是说,我将plink设为双重指针,但只解引用一次,就不算解引用一个空指针??
(注;问题来源于ucos-ii内存管理章节)
在此先谢过大侠回答!!

lcofjp 发表于 2013-5-24 07:11:49

edgar1989 发表于 2013-5-23 23:22 static/image/common/back.gif
很感谢您的回答,容我在追问一下:若我将函数fun改为:
void fun(void * addr)
{


您好,解引用一次是可以的,类型是明确的,为指针类型。

edgar1989 发表于 2013-5-24 10:04:48

lcofjp 发表于 2013-5-24 07:11 static/image/common/back.gif
您好,解引用一次是可以的,类型是明确的,为指针类型。

恩,明白了,多谢!
页: [1]
查看完整版本: C语言指针问题请教