QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1395|回复: 12

Linux GDB C 把问题精简 了一下,请帮忙看看

[复制链接]
发表于 2006-4-26 23:22:16 | 显示全部楼层 |阅读模式
Linux GDB C 把问题精简 了一下,请帮忙看看

typedef struct
{
unsigned int weight;
unsigned int parent, lchild, rchild;
}HTNode, *HuffmanTree;

main()
{
HTNode *HT = (HTNode *)malloc((4) * sizeof(HTNode));
HTNode **p;

p = &HT;
HT[0].weight = 4;
HT[1].weight = 4;
HT[2].weight = 4;
HT[3].weight = 4;

p[0]->weight = 4;
p[1]->weight = 4;
p[2]->weight = 4; //error ! ! !
p[3]->weight = 4; //error ! ! !
}

----------------------------------------------

(gdb)

Program received signal SIGSEGV, Segmentation fault.
0x080483bc in main () at test6.c:20
20 p[2]->weight = 4; //error ! ! !
----------------------------------------------
我把问题精简 了一下,请帮忙 看看

问题补充:SIGSEGV : 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.

但是我找不出来
发表于 2006-4-27 09:41:58 | 显示全部楼层
[code:1]
        printf("%p %p\n",&HT[0], p[0]);
        printf("%p %p\n",&HT[1], p[1]);
        printf("%p %p\n",&HT[2], p[2]);
        printf("%p %p\n",&HT[3], p[3]);
[/code:1]
回复

使用道具 举报

发表于 2006-4-27 10:09:49 | 显示全部楼层
应该分别赋值
p=malloc(4*sizeof(void *));
p[0] = &HT[0];
p[1] = &HT[1];
p[2] = &HT[2];
p[3] = &HT[3];

你声明HTNode **p时,因为是二级指针,所以p[?]本身的类型还是指针,而不是你想像中的HTNode,而且首先你得给p分配内存。
回复

使用道具 举报

 楼主| 发表于 2006-4-27 11:09:33 | 显示全部楼层
HTNode *HT = (HTNode *)malloc((4) * sizeof(HTNode));
分配4大小连续内存 ,HT 指向首地址

p = &HT

p指向HT(&HT[0]) de 地址 (地址de地址)

p[?](*(p+?))本身的类型还是指针 == HT[?]

p[?]->weight = ?
HT[?]->weight = ?

一个道理啊 ??
回复

使用道具 举报

发表于 2006-4-27 11:19:29 | 显示全部楼层
这是内存结构图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2006-4-27 11:20:10 | 显示全部楼层
0x97e2038 0x97e2038
21              printf("%p %p\n",&HT[0], p[0]);   //same
(gdb)
0x97e2008 0x97e2008
22              printf("%p %p\n",&HT[1], p[1]);   //same
(gdb)
0x97e2018 0xbff18f38
23              printf("%p %p\n",&HT[2], p[2]);   //no
(gdb)
0x97e2028 0xbd5750
24              printf("%p %p\n",&HT[3], p[3]);   //no

why ???
回复

使用道具 举报

 楼主| 发表于 2006-4-27 11:26:35 | 显示全部楼层
malloc 分配4大小"连续"内存

HT(&HT[0]) 指向首地址
&HT[1]自然指向下一位
......

p指向HT首地址
&p[1]自然指向下一位
......

anything error ???
回复

使用道具 举报

发表于 2006-4-27 11:41:44 | 显示全部楼层
P[0]值就是HT值,存储HT值是另外一块内存(4字节),跟你malloc并不是一块内存,它的值就是malloc得到的内存的首地址,所以p[0]的值就是malloc得到的内存的首地址。但是p[1]是HT后面的4个字节,这4个字节是未经分配的区域,值也未初始化,所以p[1]指向哪是未知的,p[2],p[3]同理。
回复

使用道具 举报

发表于 2006-4-27 11:43:01 | 显示全部楼层
p并不是直接指向你用malloc分配的内存。
回复

使用道具 举报

 楼主| 发表于 2006-4-27 11:56:21 | 显示全部楼层
哈  谢谢,明白了
回复

使用道具 举报

发表于 2006-4-29 10:25:30 | 显示全部楼层
双星指针,房子里面放钥匙.
(*p)[0]->weight=4;
(*p)[1]->weight=4;
(*p)[3]->weight=4;
(*p)[4]->weight=4;
回复

使用道具 举报

 楼主| 发表于 2006-4-29 18:31:23 | 显示全部楼层
楼上的姐姐,我觉得你说的不对

(1).
HTNode **p 是两层指针,而你的代码中 "*"已经对其解引用了一次.之后又用"[]"
再解引用了一次,而后你还用"->"来引索成员,编译期就不能通过的.

(2).
还有,其实定义p = &HT,然后用对p的解引用(* 或 [])来操作
这种写法本来就是不合理的.因为并没有对p分配空间,所以根本不知道
p[1]指哪里(p[0]和 HT(&HT[0]) 地址相通),但p[1]决不和&HT[1]的地址相同

大家看看,不知道我说的对不对????




附加一个问题,大家帮忙看看怎么解决:

[root@localhost root]# rar
rar: error while loading shared libraries: libstdc++.so.6: cannot
open shared object file: No such file or directory
回复

使用道具 举报

发表于 2006-5-3 14:39:50 | 显示全部楼层
(*p)[0].weight=4;
(*p)[1].weight=4;
(*p)[3].weight=4;
(*p)[4].weight=4;

this is ok.
p是一把钥匙,指向房间A,房间A里放着一把钥匙叫做*p,它指向用malloc分配的那块内存单元的首址.
房间A的地址等于p,也等于&HT,房间A里存放的钥匙是*p.

因为rar程序里调用了某些个函数,这些函数的代码在libstdc++.so.6里面,但是你的系统里面没有libstdc++.so.6这个文件或者其它什么原因找不到 libstdc++.so.6,所以就提示这个错误了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 16:26 , Processed in 0.076518 second(s), 17 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表