求帮忙看一下这个 C 代码为什么会段错误!

206 天前
 gooooood
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 崩溃
	}
}
1382 次点击
所在节点    C
16 条回复
codehz
206 天前
你这类型不对吧 INFO_T *pInfo[]
memcpy 的是 INFO_T *的 pInfo[m]到 INFO_T 的 tInfo 。。。
DuckBurrito
206 天前
我没理解错的话应该改成下面这样子吧

memcpy(&tInfo, pInfo[m], sizeof(INFO_T));

像你这样子写实际上是在复制一个 INFO_T 指针的值到 tInfo 中,并没有复制 INFO_T 结构体
yianing
206 天前
tInfo 是一个栈上内存,第一个 printf 只经过一次寻址,只是读栈上部分不会出错,第二个 printf 参数是二级指针对应的数据需要经过两次寻址,可能是你参数有问题
woooooOOOO
206 天前
memcpy(&tInfo, pInfo[m], sizeof(INFO_T));
pInfo[m]就是一个地址,不用再取&
lsry
206 天前
函數參數用的 INFO_T *pInfo[],由於數組作參數,這代表是個 二級指針 INFO_T **,這可能有兩種情況:
1. 代表二維數組,pInfo[m]->width 這就不對了,pinfo[m] 代表一維數組,要 pInfo[m][k] 才是 INFO_T struct ;
2. 對一維數組再取一次地址,pInfo[m]->width 就要改成 (*pInfo)[m];
具體取決於你的代碼
DiamondY
205 天前
要看一下传入 Send()里面的 pInfo 是啥东西,从上下文猜测的话,应该搞混了指针和指针数组
gooooood
205 天前
@codehz 确实,实际上传参使用 INFO_T pInfo[]就可以了,使用 INFO_T *pInfo[]有点多此一举了
gooooood
205 天前
@lsry 尝试了,这样也有问题。正确的应该是:(((INFO_T *)pInfo)+m)->width
gooooood
205 天前
@DiamondY 有点搞混了
gooooood
205 天前
@DuckBurrito 好像两种都可以诶
gooooood
205 天前
@yianing 确实是参数错误引起的问题
gooooood
205 天前
@woooooOOOO 我打印了两个值,结果是一样的
araraloren
205 天前
Your test code is totally wrong.
araraloren
205 天前
realJamespond
205 天前
tInfo 已经分配内存,pInfo[m]内存越界了肯定报错,怎么没区别?
gooooood
204 天前
@araraloren agree.Thanks

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/983240

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX