首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

程序异常,求热心人高手帮小弟我看看

2013-04-20 
程序错误,求热心人高手帮我看看#include stdio.h#include stdlib.h#include string.htypedef struct

程序错误,求热心人高手帮我看看


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct  gvr_pdu
{
   int  uiLength;      
   char   *pucContent;    
}Gvr_pdu;

typedef enum {
  UID_CNTRL = 0,
  UID_BPDU
} UID_CMD_TYPE_T;

typedef enum {
  UID_PORT_CONNECT,
  UID_PORT_DISCONNECT,
  UID_BRIDGE_SHUTDOWN,
  UID_BRIDGE_HANDSHAKE,
  UID_LAST_DUMMY
} UID_CNTRL_CMD_T;

typedef struct uid_port_control_s {
  UID_CNTRL_CMD_T cmd;
  unsigned long  param1;  
  unsigned long  param2;  
} UID_CNTRL_BODY_T;

typedef struct uid_msg_header_s {
  UID_CMD_TYPE_T    cmd_type;
  long          sender_pid;
  int           destination_port;
  int           source_port;
  size_t        body_len;
} UID_MSG_HEADER_T;

typedef struct uid_msg_s {
  UID_MSG_HEADER_T  header;
  union {
    UID_CNTRL_BODY_T    cntrl;
    char bpdu[64];
  } body;

} UID_MSG_T;

void test(UID_MSG_T *msg)
{
int port_no;

Gvr_pdu *sGvrpPud = (Gvr_pdu *)malloc(sizeof(Gvr_pdu));
sGvrpPud->pucContent = (char *)malloc(sizeof(char)*100);

port_no = msg->header.source_port;
sGvrpPud->uiLength = msg->header.body_len ;
printf("port num:%d \t uiLength:%d\n",port_no,sGvrpPud);
memcpy(sGvrpPud->pucContent,msg->body.bpdu ,sGvrpPud->uiLength);

}
int main()
{
char *buff="kadjaljdladl";
UID_MSG_T *msg;
int msgsize;

msg->header.sender_pid = 100;
msg->header.cmd_type =UID_BPDU;
msg->header.source_port=1;
msg->header.body_len=strlen(buff);
memcpy(msg->body.bpdu,buff,strlen(buff));
test(msg);
return 0;
}

这段代码的错误就是在 memcpy(msg->body.bpdu,buff,strlen(buff))这里
小弟不才,基础比较差,看了很久了也没有看出具体是哪错了,反正就是报段错误,无奈了都
C 段错误 内存复制
[解决办法]


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct  gvr_pdu
{
   int  uiLength;      
   char   *pucContent;    
}Gvr_pdu;

typedef enum {
  UID_CNTRL = 0,
  UID_BPDU
} UID_CMD_TYPE_T;

typedef enum {
  UID_PORT_CONNECT,
  UID_PORT_DISCONNECT,
  UID_BRIDGE_SHUTDOWN,
  UID_BRIDGE_HANDSHAKE,
  UID_LAST_DUMMY
} UID_CNTRL_CMD_T;

typedef struct uid_port_control_s {


  UID_CNTRL_CMD_T cmd;
  unsigned long  param1;  
  unsigned long  param2;  
} UID_CNTRL_BODY_T;

typedef struct uid_msg_header_s {
  UID_CMD_TYPE_T    cmd_type;
  long          sender_pid;
  int           destination_port;
  int           source_port;
  size_t        body_len;
} UID_MSG_HEADER_T;

typedef struct uid_msg_s {
  UID_MSG_HEADER_T  header;
  union {
    UID_CNTRL_BODY_T    cntrl;
    char bpdu[64];
  } body;

} UID_MSG_T;

void test(UID_MSG_T *msg)
{
int port_no;

Gvr_pdu *sGvrpPud = (Gvr_pdu *)malloc(sizeof(Gvr_pdu));
sGvrpPud->pucContent = (char *)malloc(sizeof(char)*100);

port_no = msg->header.source_port;
sGvrpPud->uiLength = msg->header.body_len ;
printf("port num:%d \t uiLength:%d\n",port_no,sGvrpPud);
memcpy(sGvrpPud->pucContent,msg->body.bpdu ,sGvrpPud->uiLength);

}
int main()
{
char *buff="kadjaljdladl";
UID_MSG_T *msg = new UID_MSG_T;//new一下编译通过了的
int msgsize;

msg->header.sender_pid = 100;
msg->header.cmd_type =UID_BPDU;
msg->header.source_port=1;
msg->header.body_len=strlen(buff);
memcpy(msg->body.bpdu,buff,strlen(buff));
test(msg);
delete msg;
return 0;
}


[解决办法]
你那个 msg 连空间都没分配就在拷贝内存,不崩溃才怪。
[解决办法]
非法访问,你定义UID_MSG_T *msg; 这个地址是不知道,是没有指向一个具体的合法允许的内存单元。操作就会出错,msg就是一个编译器编译的时候给的默认的地址。指向一个合法的内存就对了!
[解决办法]
你的msg能不能先new空间出来啊...
[解决办法]
 UID_MSG_T *msg;这个属于野指针;你们有给其申请空间就用是不对的。
[解决办法]
哥,你msg分配内存了么?
[解决办法]
那你得调试看看  我觉得有可能是结构体对齐的问题

msg = (UID_MSG_T*) buff;  // 你得确认buff的内容是否和msg结构体定义的一致
[解决办法]
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
但我又不得不承认:
 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物;
 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。
而我本人属前者。

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!



提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

[解决办法]
 UID_MSG_T *msg;msg没分配地址就直接使用

热点排行