关于C语言结构体指针做函数形参的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C语言结构体指针做函数形参的问题相关的知识,希望对你有一定的参考价值。

#include<stdio.h> #include<string.h> #define N 10 typedef struct ss char num[10]; int s; STU; void fun(STU a[],STU *s) int t,p=0; t=a[0].s; for(int i=1;i<N;i++) if(t>a[i].s) t=a[i].s; p=i; *s=a[p]; void main() STU a[N]= "A01",81,"A02",81,"A03",81,"A04",81,"A05",81, "A06",81,"A07",81,"A08",61,"A09",81,"A010",81 ,m; printf("the original data is :\n"); for(int i=0;i<N;i++) printf("NO=%s MARK=%d\n",a[i].num,a[i].s); fun(a,&m); printf("the lowest is %s who's score is %d\n",m.num,m.s); 把fun函数里的最后一行代码*s=a[p];改成s=&a[p];就不行了,感觉差不多,不知道问题出在哪,求教~~~

参考技术A fun函数的第二个参数之所以用指针,就是为了能把函数里面对这个参数做的改动保存下来
而你如果把*s=a[p];改成s=&a[p];效果相当于,改了s的值,使其不再指向参数(函数
外部变量
m)的地址,虽然*s的值是正确的,但实际m的值则没有改变,所以在外面输出的时候,结果和预期不一致了
s=&a[p];这个操作本身没有问题
参考技术B a[p]是个数组,在计算机里面存储的就是他的地址,用&再在他地址的基础上在取地址明显是会报错的。
在c语言里面数组都是存的首地址,所以数组和指针有的时候是可以互换的,&是取地址符号,数组里面本就已经是地址了在用&肯定回有问题的

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语言结构体指针做函数形参的问题的主要内容,如果未能解决你的问题,请参考以下文章

C 语言关于结构体做参数传递?

C 语言结构体 ( 结构体作为函数参数 | 结构体指针作为函数参数 )

c语言中,函数的形参啥时候必须是指针

C语言中关于结构体指针为啥不能在函数内赋初值的问题?

c语言中关于结构体 调用函数的问题 新手求教

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