typedef struct {
int width;
int height;
int depth;
} INFO_T;
int Send(int infoNum, const INFO_T *pInfo[])
{
INFO_T tInfo;
for (int m = 0; m < infoNum; m++) {
memcpy(&tInfo, &pInfo[m], sizeof(INFO_T));
printf("info=%d \n", tInfo.width); //这条语句是正常的
printf("info=%d \n", pInfo[m]->width); //按理说这条和上面一条是等价的,但是加入这条语句后就会 core 崩溃
}
}
我感觉是我的表达不够准确,重述一下:其实我是想探索如何使用结构体二级指针进行传参。 通过一番尝试,我发现使用结构体二级指针是有些多余的,直接使用 INFO_S info[]作为传参即可。
如果想使用结构体二级指针,正确引用的方式为:
printf("info=%d %d\n", (((INFO_T *)pInfo)+m)->width,((INFO_T *)pInfo+m)->height);
以下是我的调试代码与结果:
#include <stdio.h>
#include <string.h>
typedef struct {
int width;
int height;
} INFO_T;
int Send(int infoNum, const INFO_T *pInfo[])
{
printf("func addr=%#x %#x %#x %#x %#x %#x\n", pInfo, *pInfo, &pInfo[0], pInfo, &pInfo[1],pInfo+1);
for (int m = 0; m < infoNum; m++) {
printf("info=%d %d\n", (((INFO_T *)pInfo)+m)->width,((INFO_T *)pInfo+m)->height);
}
return 0;
}
int main()
{
printf("Hello, World! \n");
INFO_T atInfo[2];
atInfo[0].width = 9;atInfo[0].height = 2;
atInfo[1].width = 3;atInfo[1].height = 4;
printf("main addr =%#x %#x %#x %#x %#x\n", atInfo, &atInfo, &atInfo[0].width, &atInfo[0].height,&atInfo[1] );
Send(2,(const INFO_T**)atInfo);
return 0;
}
Hello, World!
main addr =0xeb58c490 0xeb58c490 0xeb58c490 0xeb58c494 0xeb58c498
func addr=0xeb58c490 0x9 0xeb58c490 0xeb58c490 0xeb58c498 0xeb58c498
info=9 2
info=3 4
Anyway, 感谢大家的帮助~
1
codehz 2023-10-18 19:10:46 +08:00
你这类型不对吧 INFO_T *pInfo[]
memcpy 的是 INFO_T *的 pInfo[m]到 INFO_T 的 tInfo 。。。 |
2
DuckBurrito 2023-10-18 19:28:08 +08:00
我没理解错的话应该改成下面这样子吧
memcpy(&tInfo, pInfo[m], sizeof(INFO_T)); 像你这样子写实际上是在复制一个 INFO_T 指针的值到 tInfo 中,并没有复制 INFO_T 结构体 |
3
yianing 2023-10-18 19:42:04 +08:00
tInfo 是一个栈上内存,第一个 printf 只经过一次寻址,只是读栈上部分不会出错,第二个 printf 参数是二级指针对应的数据需要经过两次寻址,可能是你参数有问题
|
4
woooooOOOO 2023-10-18 19:43:45 +08:00
memcpy(&tInfo, pInfo[m], sizeof(INFO_T));
pInfo[m]就是一个地址,不用再取& |
5
lsry 2023-10-18 20:56:16 +08:00
函數參數用的 INFO_T *pInfo[],由於數組作參數,這代表是個 二級指針 INFO_T **,這可能有兩種情況:
1. 代表二維數組,pInfo[m]->width 這就不對了,pinfo[m] 代表一維數組,要 pInfo[m][k] 才是 INFO_T struct ; 2. 對一維數組再取一次地址,pInfo[m]->width 就要改成 (*pInfo)[m]; 具體取決於你的代碼 |
6
DiamondY 2023-10-19 08:36:08 +08:00
要看一下传入 Send()里面的 pInfo 是啥东西,从上下文猜测的话,应该搞混了指针和指针数组
|
7
gooooood OP @codehz 确实,实际上传参使用 INFO_T pInfo[]就可以了,使用 INFO_T *pInfo[]有点多此一举了
|
10
gooooood OP @DuckBurrito 好像两种都可以诶
|
12
gooooood OP @woooooOOOO 我打印了两个值,结果是一样的
|
13
araraloren 2023-10-19 12:37:30 +08:00
Your test code is totally wrong.
|
14
araraloren 2023-10-19 12:47:00 +08:00
You should pass a array with element type `INFO_T *`.
Check out: `https://godbolt.org/z/TG1qn9rfK` And the rust code: `https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=02ef0129fa852c201304e766d868289a` |
15
realJamespond 2023-10-19 16:41:40 +08:00
tInfo 已经分配内存,pInfo[m]内存越界了肯定报错,怎么没区别?
|
16
gooooood OP @araraloren agree.Thanks
|