
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("nfo=%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 |