Stack around the variable was corrupted

wula0010 2019-06-09 01:14:19

#include "stdafx.h"
#include <Windows.h>


void trim(char *pszStr){

int i, j, iLenght;

iLenght = strlen(pszStr);

char *pszTmp = (char*)malloc(iLenght + 1);
strncpy_s(pszTmp, iLenght + 1, pszStr, iLenght);
pszTmp[iLenght] = '\0';

i = 0;

j = strlen(pszTmp) - 1;

while (pszTmp[i] == ' ')
++i;

while (pszTmp[j] == ' ')
--j;
strncpy_s(pszStr, iLenght + 1, pszTmp + i, j - i + 1);
pszStr[j - i + 2] = '\0';
free(pszTmp);
pszTmp = NULL;
}

int _tmain(int argc, _TCHAR* argv[])
{
char szBegdate[11] = "2019-12-31";
trim(szBegdate);
return 0;
}


很奇怪报错,参看https://bbs.csdn.net/topics/340143691,把修改为:
char szBegdate[12] = "2019-12-31";
就不会报错了,可我这个szBegDate包括结尾的'\0',明明只需要11个char就够了啊,
...全文
210 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gouyanfen 2019-06-10
  • 打赏
  • 举报
回复
引用 3 楼 636f6c696e 的回复:
声明pszStr[11],最后一个元素是pszStr[10],这是很容易犯的差一错误。 对于你第二个问题,C语言并不一是一旦内存越界就立即会报错的,Stack around the variable was corrupted 这个错误是函数返回后检查栈内存是否完整,因为你那一句越界了,所以检测出栈内存问题报的错 [quote=引用 2 楼 wula0010 的回复:] [quote=引用 1 楼 636f6c696e 的回复:] 问题出在pszStr[j - i + 2] = '\0'; 你例子中等价于访问了pszStr[11],越界了。 应改成pszStr[j - i + 1] = '\0';
pszStr[11]是'\0',是字符串的结尾,这个不能访问么?如果不能访问, 应该在pszStr[j - i + 2] = '\0';这句报错,可实际上是在trim(char *pszStr)返回后才报错,中间还有两句,这两句都正常执行,这么理解有错么? free(pszTmp); pszTmp = NULL; [/quote][/quote] 出问题,并不代表马上就会出错,pszTmp是在栈上分配的,越界操作,会有能破坏栈,但也不是一定会,返回才会出错是因为pszTmp是这个函数在栈上分配的最后一个变量,他后面的就是返回地址,函数执行完毕之后return ,会弹栈返回, pop ebp return X 这个时候ebp有可能被破坏了,所以程序才会在返回之后报错。 个人理解,没有实际汇编验证,如有错误理解,欢迎指正
636f6c696e 2019-06-10
  • 打赏
  • 举报
回复
声明pszStr[11],最后一个元素是pszStr[10],这是很容易犯的差一错误。 对于你第二个问题,C语言并不一是一旦内存越界就立即会报错的,Stack around the variable was corrupted 这个错误是函数返回后检查栈内存是否完整,因为你那一句越界了,所以检测出栈内存问题报的错
引用 2 楼 wula0010 的回复:
[quote=引用 1 楼 636f6c696e 的回复:] 问题出在pszStr[j - i + 2] = '\0'; 你例子中等价于访问了pszStr[11],越界了。 应改成pszStr[j - i + 1] = '\0';
pszStr[11]是'\0',是字符串的结尾,这个不能访问么?如果不能访问, 应该在pszStr[j - i + 2] = '\0';这句报错,可实际上是在trim(char *pszStr)返回后才报错,中间还有两句,这两句都正常执行,这么理解有错么? free(pszTmp); pszTmp = NULL; [/quote]
wula0010 2019-06-09
  • 打赏
  • 举报
回复
引用 1 楼 636f6c696e 的回复:
问题出在pszStr[j - i + 2] = '\0'; 你例子中等价于访问了pszStr[11],越界了。 应改成pszStr[j - i + 1] = '\0';
pszStr[11]是'\0',是字符串的结尾,这个不能访问么?如果不能访问, 应该在pszStr[j - i + 2] = '\0';这句报错,可实际上是在trim(char *pszStr)返回后才报错,中间还有两句,这两句都正常执行,这么理解有错么? free(pszTmp); pszTmp = NULL;
636f6c696e 2019-06-09
  • 打赏
  • 举报
回复
问题出在pszStr[j - i + 2] = '\0'; 你例子中等价于访问了pszStr[11],越界了。 应改成pszStr[j - i + 1] = '\0';

69,369

社区成员

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

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