学习电脑 发表于 2016-6-30 11:01:00

C的指针问题

# include <stdio.h>

int main()
{
        int i = 5;
        int *p, *q;


       p = &i;
   *q = p;
   


        printf("%d\n",*q);

        return 0;
}


为什么程序会出错?   *q = p不行吗?不同类型不是可以相互赋值吗,只是会丢失数据而已啊!

n0noper 发表于 2016-6-30 12:23:42


那你非要说 不同类型可以相互赋值我也是没办法的。

上边这句话从汇编角度上说 应该是可以的,毕竟寄存器之间可以委屈转换一下,但是除非你不用编译器,否则就得遵循人家编译器的规则。(有的隐式转换可以,但是有的就有限制啊)

还有一个地方,你q这个指针变量没有初始值,就算编译器不跟你计较,系统也会找你的事啊。万一指向0x00000000了呢?

学习电脑 发表于 2016-6-30 17:59:18

n0noper 发表于 2016-6-30 12:23
那你非要说 不同类型可以相互赋值我也是没办法的。

上边这句话从汇编角度上说 应该是可以的,毕竟寄 ...

q里面不是垃圾值吗?

edc41113359 发表于 2016-6-30 21:19:27

{:10_249:}

n0noper 发表于 2016-6-30 22:10:04

学习电脑 发表于 2016-6-30 17:59
q里面不是垃圾值吗?


你确定?

垃圾值到底是多少?万一是0x00000000呢?

具体调试,我也不知道 {:10_250:}

学习电脑 发表于 2016-7-1 09:27:29

n0noper 发表于 2016-6-30 22:10
你确定?

垃圾值到底是多少?万一是0x00000000呢?


好吧,谢谢

学习电脑 发表于 2016-7-1 09:28:02

edc41113359 发表于 2016-6-30 21:19


{:10_282:}

GameBelial 发表于 2016-7-1 10:22:31

{:10_269:}你要相互赋值也不是没有办法,强制类型转换就行了。

学习电脑 发表于 2016-7-1 11:19:08

GameBelial 发表于 2016-7-1 10:22
你要相互赋值也不是没有办法,强制类型转换就行了。

不转换就不行?

scdwuhan 发表于 2016-7-1 14:12:37

指针不赋初值,野指针比较危险

小剑剑 发表于 2016-7-1 15:10:55

GameBelial 发表于 2016-7-1 10:22
你要相互赋值也不是没有办法,强制类型转换就行了。

似乎转换类型也不行

阁龙1427 发表于 2016-7-2 11:24:38

养成良好的变成习惯,不要使用野指针。除非你知道自己在做什么

qq1242009750 发表于 2016-7-2 14:58:27

不行只能
int main()
{   int i = 5;
    int *p,*q;
    p = &i;
    q = p;
    printf("Hello world!%d\n",*p);
    printf("Hello world!%d\n",*q);
    return 0;
}

学习电脑 发表于 2016-7-2 18:38:42

阁龙1427 发表于 2016-7-2 11:24
养成良好的变成习惯,不要使用野指针。除非你知道自己在做什么

野指针就是每赋值?

阁龙1427 发表于 2016-7-4 09:15:44

学习电脑 发表于 2016-7-2 18:38
野指针就是每赋值?

任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

学习电脑 发表于 2016-7-4 10:12:57

阁龙1427 发表于 2016-7-4 09:15
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建 ...

xiexie

阁龙1427 发表于 2016-7-4 10:35:24

学习电脑 发表于 2016-7-4 10:12
xiexie

    “野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:
    (1)、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
    (2)、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。
这个是在chao_yu的博客中看到的,这个解释能理解吧 :)

阁龙1427 发表于 2016-7-4 10:39:33

学习电脑 发表于 2016-7-4 10:12
xiexie

就像玩指身体部位的游戏。让你指哪里就指哪里,初始化的时候要指向脚(赋初值),然后让你指耳朵就指向耳朵。如果让你指脸你指人家屁股就是要出问题的吧。

学习电脑 发表于 2016-7-6 11:35:17

阁龙1427 发表于 2016-7-4 10:35
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易 ...

恩,谢谢
页: [1]
查看完整版本: C的指针问题