c语言中2个结构体的头指针相等,会不会把其中一个覆盖了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中2个结构体的头指针相等,会不会把其中一个覆盖了相关的知识,希望对你有一定的参考价值。

while((c=getchar())!='\n')

temp=(arcnode *)malloc(sizeof(arcnode));//把与该顶点相关的顶点的表结点连在一起
temp->num=locate(g,c);
rear->nextarc=temp;
rear=temp;

rear 和 temp 都是同类型结构体,他们的头指针相等了,会不会覆盖的

楼主你好。
rear->nextarc=temp;
rear=temp;
这两行代码的意思是先让尾节点的nextarc指向temp,然后再将尾节点指针指向temp,相当于在链表尾部添加了一个节点。
没有覆盖一说,这里只有指针的赋值。
这段代码的意义是:先用temp指针malloc一个arcnode,然后将temp放到链表结尾(当然这里可能不是链表,但是rear应该是指示了一个连续结构的最后一个节点)。
rear(指向链表结尾) temp(利用temp创建一个新的arcnode)
↓ ↓
□ □
然后
rear(将temp赋值给rear指针,rear就指向了链表末尾)

□→□(原来的尾节点的nextarc指针指向了新的尾节点)追问

让我慢理清思路先

追答

rear指针是用来标识最后一个节点的。temp指针是用来指向malloc产生的arcnode节点的。
temp创建成功之后,就可以把temp指向的arcnode放到链表结尾了,操作如下:
先让temp链接到链表尾部,也就是让rear节点的nextarc指针指向temp。
然后rear节点这时候就需要指向新的最后一个节点啦,也就是将temp赋给rear,就相当于rear指向了temp指向的那个arcnode。
够清楚了吧?

参考技术A 我给你写一个加注释的链表,一看就懂了。

#include <stdio.h>
#include <stdlib.h>

typedef struct node

int data;
struct node *next;
linknode,*link;

link creatlist() //创建链表

int a;
link H,P,r;
H=(link)malloc(sizeof(linknode)); //创建第一个节点,或者叫做首节点H
r=H; //用r指向H,r为移动的结构指针
a=15;//变量表示创建一个含有15个节点链表
while(a>0)

P=(link)malloc(sizeof(linknode)); //P为想插入的节点指针
P->data=a; //为p->data赋值
r->next=P; //注意现在的r->next实际就是H->next,让H的next指针指向下一个节点P
r=P;//再将r指针移动到最后的节点P
a--;

r->next=NULL; //最后节点的next指针为空
return H;//返回链表的起始节点
参考技术B 会不会是你理解错了,这只是建立了个头结点嘛,头结点的下一个指向自己而已追问

但是rear 和temp 相同喔, rear =temp 是什么意思,我搞不明白

追答

我学数据结构很久了,rear =temp 我也有点忘了,但是temp只是一个结点,不是头结点

Delphi调用Dll返回结构体的问题?

C写的一个动态库,其中有些函数的返回值为结构体(非指针),然后在Delphi里调用,得到的返回结果是错误的。
例如,在C里面:
结构体:
typedef struct uv_buf_t
ULONG len;
char* base;
uv_buf_t;
导出的函数:
uv_buf_t uv_buf_init(char* base, unsigned int len)
uv_buf_t buf;
buf.base = base;
buf.len = len;
return buf;

在Delphi里:
对应C的结构体:
uv_buf_t = record
len: ULONG;
base: PAnsiChar;
end;
函数声明为:
uv_buf_init: function(base: PAnsiChar; len: Cardinal): uv_buf_t;
在Delphi中调用:
procedure test2;
var
buf: uv_buf_t;
s: PAnsiChar;
begin
s := 'abcde';
buf := uv_buf_init(@s, 5);
Writeln('buf的值:len=' + IntToStr(buf.len) + ' base=' + buf.base);
end;
最终的结果是错误的,而且会导致传到C中的参数的值也不对,如果把C库中函数的返回值和Delph声明函数的返回值都改为指针就一点问题都没有,但是我们是不能动C代码的,只能接收返回的结构体,不知哪位高手有解决办法或思路,在此先谢过了。
uv_buf_init: function(base: PAnsiChar; len: Cardinal): uv_buf_t; cdecl;
调用约定都试过了,还是不行。

那就看你的结构体和传参是否正确了,你光这样瞎说,没人看的出问题。起码关键代码和大致错误贴出来. 参考技术A uv_buf_init: function(base: PAnsiChar; len: Cardinal): uv_buf_t;stdcall;

追问

调用约定都试过了,还是不行。这个也试过了的,不行。

追答buf^ := uv_buf_init(@s, 5);  //试试

追问

这样也不行的。

追答//定义
uv_buf_t = record
    len: ULONG;
    base: PAnsiChar;
  end;
puv_buf_t= ^uv_buf_t;  

//函数
var ppi:puv_buf_t
begin
   ppi :=allocmem(sizeof(uv_buf_t));
   ....
   ....
   ....
end;

本回答被提问者和网友采纳

以上是关于c语言中2个结构体的头指针相等,会不会把其中一个覆盖了的主要内容,如果未能解决你的问题,请参考以下文章

C语言结构体定义

Delphi调用Dll返回结构体的问题?

【嵌入式C】在Keil中结构体的字节对齐

关于C语言中函数修改结构体的值的问题

c语言 结构体的指针作为函数参数问题

怎样求结构体成员的偏移地址 || 结构体的 sizeof 总结