局部变量 char数组,不是每次都重新分配的吗??

liang8305 2010-12-27 04:13:38
写程序的时候发现一个不太理解的现象,本来的目的是做一个监听,按时间把在线玩家的名字保存下来
结果类似:

时间段1,序号1,名字1
时间段1,序号2,名字2
时间段1,序号3,名字3
时间段2,序号1,名字1
时间段2,序号2,名字2
时间段2,序号3,名字3
时间段3,序号1,名字1
时间段3,序号2,名字2
时间段3,序号3,名字3


程序为:

//info:结果信息结构体
void RfC51GaugePlugin::UpdateScoring(const ScoringInfoV2 &info)
{

DWORD now=GetTickCount();
//保存间隔
if(now-lastSaveTime>saveDelay && info.mNumVehicles>0)
{

const unsigned int cusBufferSize = 50*1024;
char cpTemp[cusBufferSize];


//历遍在线玩家
for( long i = 0; i < info.mNumVehicles; ++i )
{
//玩家信息结构体
VehicleScoringInfoV2 &vinfo = info.mVehicle[ i ];

//字符串连接 : 时间段1,序号1,名字1 + "\n"+ 时间段1,序号2,名字2 ....
sprintf(cpTemp, "%s%d,%d,%s\n"
,cpTemp,GetTickCount()/1000,i
, vinfo.mDriverName);

}
saveLog(cpTemp);
}


}


多次调用这个方法,得到的结果是类似:
时间段1,序号1,名字1
时间段1,序号2,名字2
时间段1,序号3,名字3
时间段1,序号1,名字1 //时间段2里含有时间段1的"字符串"
时间段1,序号2,名字2
时间段1,序号3,名字3
时间段2,序号1,名字1
时间段2,序号2,名字2
时间段2,序号3,名字3
时间段1,序号1,名字1 //时间段3里含有时间段1和2的"字符串"
时间段1,序号2,名字2
时间段1,序号3,名字3
时间段2,序号1,名字1
时间段2,序号2,名字2
时间段2,序号3,名字3
时间段3,序号1,名字1
时间段3,序号2,名字2
时间段3,序号3,名字3


后来修改程序,每次先将cpTemp 清空,则程序正常
程序为 :

//info:结果信息结构体
void RfC51GaugePlugin::UpdateScoring(const ScoringInfoV2 &info)
{

DWORD now=GetTickCount();
//保存间隔
if(now-lastSaveTime>saveDelay && info.mNumVehicles>0)
{

const unsigned int cusBufferSize = 50*1024;
char cpTemp[cusBufferSize];

sprintf(cpTemp,""); //清空
//历遍在线玩家
for( long i = 0; i < info.mNumVehicles; ++i )
{
//玩家信息结构体
VehicleScoringInfoV2 &vinfo = info.mVehicle[ i ];

//字符串连接 : 时间段1,序号1,名字1 + "\n"+ 时间段1,序号2,名字2 ....
sprintf(cpTemp, "%s%d,%d,%s\n"
,cpTemp,GetTickCount()/1000,i
, vinfo.mDriverName);

}
saveLog(cpTemp);
}


}


我的问题是,难道每次 char cpTemp[cusBufferSize]; 的时候,cpTemp不都是新的吗?
怎么会还保存着上次的信息,切让本次 连接在上次的后面呢?

我试过
char *cpTemp=new char[cusBufferSize];
char *cpTemp=(char *)malloc(cusBufferSize);

也都不行,请c++朋友解答一下;
...全文
204 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
就想叫yoko 2010-12-27
  • 打赏
  • 举报
回复
+1[Quote=引用 6 楼 liang8305 的回复:]
咔~~~懒人语言脚本用多了

原来是字符串没有初始化的 结果

char cpTemp[cusBufferSize]={'\0'};

其实就可以了;
[/Quote]
liang8305 2010-12-27
  • 打赏
  • 举报
回复
咔~~~懒人语言脚本用多了

原来是字符串没有初始化的 结果

char cpTemp[cusBufferSize]={'\0'};

其实就可以了;
jackyjkchen 2010-12-27
  • 打赏
  • 举报
回复
memset养成习惯
pur_e 2010-12-27
  • 打赏
  • 举报
回复
新变量都要初始化的啊

你如果int a,

a的值初始也是随即的

char a[10];
这个数组不也一样是随机的吗
  • 打赏
  • 举报
回复
可能每次在调用的时候,分配的空间恰好会跟上次在栈上的在同一块,所以这样可能会出现问题

建议楼主

const unsigned int cusBufferSize = 50*1024;
char cpTemp[cusBufferSize];

memset(cpTemp, 0, cusbufferSize);
这样的话,应该不会出现上述问题,可以试试
bdmh 2010-12-27
  • 打赏
  • 举报
回复
你只是分配了空间,但是没有处理所分配空间中原有的数据,可能是以前一些程序存取这个地址留下的垃圾数据,所以你最好在分配好,对立面的数据清零
justkk 2010-12-27
  • 打赏
  • 举报
回复
局部变量在使用之前,需要初始化一下,否则它的初始值将是随机的..
另外,也不推荐sprintf(cpTemp, "...", cpTemp)的方式,也就是源和目标都是同一个变量

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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