关于memcpy和函数参数的一个小问题

garbageam 2014-07-11 08:49:31
这里有个函数,大家不用管这函数是干什么的,简单说就是包裹分拣实现中的取到堆的顶点包裹的函数
我的问题是函数中有个memcpy(),它用到了parcel这个参数,我想问这样的用法正确吗?在这个函数的下面我写了一个简单的测试程序,显示段错误,是我测试程序写错了吗?
int get_parcel(PQueue *parcels, Parcel *parcel) 
{
Parcel *data;
if (pqueue_size(parcels) == 0)
//Return that there are no parcels.
return -1;
else
{
if (pqueue_extract(parcels, (void **)&data) != 0)
//Return that a parcel could not be retrieved.
return -1;
else
{
//Pass back the highest-priority parcel.
memcpy(parcel, data, sizeof(Parcel));
free(data);
}
}
return 0;
}


#include <stdio.h>
#include <string.h>
void fun(int *a,int *q)
{
memcpy(q,a,sizeof(int));
return;
}
main()
{
int a=3;
int *q=NULL;
fun(&a,q);
printf("%d\n",*q);
}
...全文
164 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
garbageam 2014-07-11
  • 打赏
  • 举报
回复
赵老师仿佛从不解决问题,他是精神领袖
garbageam 2014-07-11
  • 打赏
  • 举报
回复
楼上的抱歉,结贴的时候没看到你
边走边瞧 2014-07-11
  • 打赏
  • 举报
回复
赵老师怎么没来?坐等赵老师解答。
边走边瞧 2014-07-11
  • 打赏
  • 举报
回复
get_parcel函数应该是没错的,不过这种写法调用pqueue_extract时,需要调用者free内存,违背了谁分配谁释放的原则,有点蹩脚但称不上错误。而你写的代码则是错误的,把a的值copy到NULL处是不正确的,应该这么写:

    int a = 3;
    int *q = (int*)malloc(sizeof(int)); // 必须分配空间
    fun(&a,q);
    free(q);
xiaohuh421 2014-07-11
  • 打赏
  • 举报
回复
memcpy 意思是内存复制. memcpy(parcel, data, sizeof(Parcel)); 即是把 接收到data中的数据使用内存复制的方式复制到parcel中, 复制的字节数是sizeof(Parcel)
xiaohuh421 2014-07-11
  • 打赏
  • 举报
回复
void fun(int *a,int *q) { memcpy(q,a,sizeof(int)); //q传入的NULL,即没有分配任何内存空间, 你却想向里写东西, 当然程序就崩溃了. return; } main() { int a=3; int *q=NULL; fun(&a,q); //q为NULL, printf("%d\n",*q); } 而别人的程序却没有你这样的问题.

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧