lsw1wsl 2015-03-04 07:58 采纳率: 100%
浏览 6097
已采纳

0xC0000005:写入位置0x0000000时发生访问冲突

以下是代码:
#include
#include
#include

#define TAG_SIGN "$$TAG=NMS"
#define TAG_LOCK "Lock"
#define TAG_DEMOD "Demod"
#define TAG_CARDID "CardID"
#define TAG_AREAID "AreaID"
#define TAG_FVOLUME "FVolume"
#define TAG_FREQ "Freq"
#define TAG_NETID "NetID"
#define TAG_TSID "TSID"
#define TAG_SERVICEID "ServiceID"
#define TAG_PVOLUME "PVolume"
#define TAG_SWITCH "Switch"
#define TAG_TIME "Time"

typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;

enum
{
SWITCH_LOCK,
SWITCH_DEMOD,
SWITCH_CARDID,
SWITCH_AREAID,
SWITCH_FVOLUME,
SWITCH_FREQ,
SWITCH_NETID,
SWITCH_TSID,
SWITCH_SERVICEID,
SWITCH_PVOLUME,
SWITCH_SWITCH,
SWITCH_TIME,
SWITCH_DEFULT
};

typedef struct NmsDataStruct
{
uint8_t lock;
char demod;
char card_id[12];
char area_id[20];
uint8_t flash_volume;
uint8_t frequency;
char net_id[4];
char ts_id[4];
char service_id[4];
uint8_t present_volume;
uint8_t i_switch;
char present_time[16];
uint16_t crc;
}NmsData, *pNmsData;

uint8_t GetSign(char *name)
{
if(strcmp(name,TAG_LOCK)==0)
return SWITCH_LOCK;
else if(strcmp(name,TAG_DEMOD)==0)
return SWITCH_DEMOD;
else if(strcmp(name,TAG_CARDID)==0)
return SWITCH_CARDID;
else if(strcmp(name,TAG_AREAID)==0)
return SWITCH_AREAID;
else if(strcmp(name,TAG_FVOLUME)==0)
return SWITCH_FVOLUME;
else if(strcmp(name,TAG_FREQ)==0)
return SWITCH_FREQ;
else if(strcmp(name,TAG_NETID)==0)
return SWITCH_NETID;
else if(strcmp(name,TAG_TSID)==0)
return SWITCH_TSID;
else if(strcmp(name,TAG_SERVICEID)==0)
return SWITCH_SERVICEID;
else if(strcmp(name,TAG_PVOLUME)==0)
return SWITCH_PVOLUME;
else if(strcmp(name,TAG_SWITCH)==0)
return SWITCH_SWITCH;
else if(strcmp(name,TAG_TIME)==0)
return SWITCH_TIME;
else
return SWITCH_DEFULT;
}

void GetFlashParameter(char pstr,NmsData pNmsData)
{
char str_name[16],string[32];
strcpy(string,pstr);
char *str_value;
str_value = strchr(string,'=')+1;
strncpy(str_name,string,str_value-string-1);
str_name[str_value-string-1]='\0';

switch(GetSign(str_name))
{
case SWITCH_LOCK:
    pNmsData->lock = 5;
    break;
case SWITCH_DEMOD:
    printf("%s=%s\n",str_name,str_value);
    break;
case SWITCH_CARDID:
    printf("%s=%s\n",str_name,str_value);
    break;
case SWITCH_AREAID:
    printf("%s=%s\n",str_name,str_value);
    break;
case SWITCH_FVOLUME:
    printf("%s=%s\n",str_name,str_value);
    break;
case SWITCH_FREQ:
    printf("%s=%s\n",str_name,str_value);
    break;
case SWITCH_NETID:
    printf("%s=%s\n",str_name,str_value);
    break;
case SWITCH_TSID:
    printf("%s=%s\n",str_name,str_value);
    break;
case SWITCH_SERVICEID:
    printf("%s=%s\n",str_name,str_value);
    break;
case SWITCH_PVOLUME:
    printf("%s=%s\n",str_name,str_value);
    break;
case SWITCH_SWITCH:
    printf("%s=%s\n",str_name,str_value);
    break;
case SWITCH_TIME:
    printf("%s=%s\n",str_name,str_value);
    break;
default:
    break;
}

}

bool ParseBuf(char* buf, int buf_len, NmsData * nms_data)
{
char string[256];
strcpy(string,buf);
char *pstr;
pstr = strtok(string, ",");
if(strcmp(pstr,TAG_SIGN)!=0)
return false;
do
{
pstr = strtok(NULL, ",");
if(pstr)
GetFlashParameter(pstr,nms_data);
} while (pstr);
}

bool main()
{
char *buf = "$$TAG=NMS,Lock=1,Demod=C,CardID=00029696,AreaID=101716112233,FVolume=20,Freq=595000,NetID=0,TSID=1,ServiceID=514,PVolume=23,Switch=0,Time=150228093000,CRC=112233";
NmsData *pNmsData = NULL;
return ParseBuf(buf,strlen(buf),pNmsData);
}

  • 写回答

3条回答 默认 最新

  • devmiao 2015-03-04 08:25
    关注

    指针没有初始化造成的。很明显指针地址不可能是0x0000000

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了