C++中关于下标越界问题

来源:百度知道 编辑:UC知道 时间:2024/09/21 23:30:46
#include<iostream>
#include<assert.h>
using namespace std;

void strNCpy(char *strDest, char const *strSrc)
{
assert((strDest != NULL) && (strSrc != NULL));
while((*strDest++ = *strSrc++) != '\0');
}
int main()
{
char* s = "asdgdsafhfdtjrtkjtyktyk";
char* t = new char[3];
strNCpy(t, s);
cout << t << endl;
return 0;
}

我想问的是,在这个程序中s的长度明显大于t的长度,为什么
while((*strDest++ = *strSrc++) != '\0');这句能够把strSrc中的元素都赋给strDest,是不是在赋值的过程中,编译器发现strDest大小不够又重新根据strSrc的大小来重新分配了存储空间呢?还是是有某个特殊的语言性质引起的,盼望高手回答.
对于一楼所说的话,那么t的下标还是越界的吧?那么为什么t的运行结果确是跟s一样呢?是不是输出的时候它只是根据'/0'来输出的,而不是根据实际的下标的界限来输出的?请1楼的大侠帮我解释下啊,对了我会追加50分

为什么while((*strDest++ = *strSrc++) != '\0');这句能够把strSrc中的元素都赋给strDest
回答:
只要内存能有操作,代码能够执行,那么就会一直执行。

是不是在赋值的过程中,编译器发现strDest大小不够又重新根据strSrc的大小来重新分配了存储空间呢?
回答:
不会。

只要能有运行,就会一直运行下去,而不管逻辑上是否正确,你就是这种情况。当碰上指令上的错误,比如操作无效的内存,必然会发生错误。你的程序没有指令上的错误。

你的程序后来之所以后来跑出错误提示,那是由于你打开了堆检查,函数运行后会自动检查堆是否正确。明显你写太多了,破坏了原来的堆,于是报错。
你应该是编译的时候开启了调试,VC++这时也可能会检查栈的正确性,当然你的栈没问题。

非法访问,但是系统没有检查出来。这样做的结果是会改动其它内存(不是系统分配的内存)的内容。甚至于改变代码的内容。缓冲出溢出漏洞就是因为写有这样的代码的。
运行如下代码,你看运行结果就知道了!
你会发现显然你没有对e进行赋值,但是e里面内容已经是s内容的后半部分了。
#include<iostream>
#include<assert.h>
using namespace std;

void strNCpy(char *strDest, char const *strSrc)
{
assert((strDest != NULL) && (strSrc != NULL));
while((*strDest++ = *strSrc++) != '\0');
}
int main()
{
char *s = "asdgdsafhfdtjrtkjtyktyk";
char t[3];
char e[100];
strNCpy(t, s);
cout <<