内存越界问题

来源:百度知道 编辑:UC知道 时间:2024/05/22 02:18:07
#include "stdafx.h"
#include<iostream>
using namespace std;

void rule(char *k_1,char *k,int f)
{
int model[7];
for(int i=0;i<7;i++)
for(int j=0;j<7;j++)
if(k_1[i]==k[j])
model[i]=j;
char change[][7]={0};
int j=f-2;
for(int i=0;i<7;i++)
change[j][i]=k_1[model[i]];
for(;j>0;j--)//*
for(int i=0;i<7;i++)//*
change[j-1][i]=change[j][model[i]];//*

for(int i=0;i<7;i++)
cout<<change[j][i];
}

void main(void)
{
char t[]="80jicu9";
char t_1[]="jciu098";
rule(t_1,t,4);
}

问题出在用*标记的地方 运行时出现"Run-Time Check Failure #2 - Stack around the variable 'change' was corrupted."
编译环境VS2005
char change[100][8]={'\0'};
这个地方能不能用指针实现

问题就出在这句话上
char change[][7]={0};
你应该是想定义一个不定大小的7位字符数组是吧?
但是有几个问题,
第一,字符串是要有结束符'\0'的,因此要定义8位
第二,你需要显式的初始化你的数组为'\0',编译器是不会自动为其添加的
此外,如果这样声明:
char change[][8]={'\0'};
将只能获得一个1*8的字符数组,此时你程序中对change进行操作时,就会出现对未知地址的访问,这是危险的,因此程序会出现内存错误。

我想解决办法应该就是为这个数组限定一个足够大的维数,比如:
char change[100][8]={'\0'};
这时候进行操作就不会出现访问未知内存的情况了。

下面加了注释行的方法是指针的,你可以在程序里加断点跟踪调试看看
//---------------------------------------
char change[100][8]={'\0'};
char *pChange; //p
pChange = (char*)malloc(sizeof(char[8])*(j+1)); //p
for(int i=0;i<=j;i++) //p
*(pChange+(i+1)*8-1)='\0'; //p

for(int i=0;i<7;i++)
{
change[j][i]=k_1[model[i]];
*(pChange+j*8+i)=k_1[model[i]]; //p
}
for(;j>0;j--)
for(int i=0;i<7;i++)
{
cha