简单问题,高手来!

来源:百度知道 编辑:UC知道 时间:2024/09/23 10:31:20
char str[10];
char str1="0123456789";
strcpy(str,str1); //这里为什么没有越界??
char* str1="0123456789";上面写错了
这里有字节对齐的问题,str[10]其实是占了12个字节的内存,所以不会有错,但是我不明白为什么str1="012345678912"不会出错(明明后面要加'\0'啊),而str1="0123456789123"才会出错

还是我自己做吧,s.p[1]=1; //问题出在这里,随意为指针分配一个地址,这是不允许的,结果会导致这样的错误:
为s.p[0]分配数2时,会导致运行时错误
#include <iostream>
using namespace std;

typedef struct{
int i;
int *p;
}S;
void main()
{
S s;
int *p=&s.i;
p[1]=3;
p[0]=4;
s.p=p;
s.p[1]=1;
s.p[0]=2; //这里为什么有错误???????

}
为什么不回答,都不会吗????

越界的话编译不会报错

执行strcpy(str,str1); 后
str[0]='0'
str[1]='1'
...
str[9]='9'
然后str[9]内存后面一个位置里面填入了'\0'

如果str[9]内存后面一个位置数据是为了其它程序用的话,就会在执行的时候报错,说内存错误

所以边界一定要自己设置好,不然很容易引起不必要的麻烦(因为编译不会报错,所以有时候越界很难检查出来)

3楼太扯了吧,自己回去在补一补再来回贴吧。
1.strcpy的实现代码
char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strSrc==NULL)) //[1]
throw "Invalid argument(s)"; //[2]
char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy;
}

参照上面的实现代码,你会发现strcpy己经假定你为strDest分配了足够的空间。
但是假如你没分配够,正如你所提到的问题。
strcpy也不会管你,它直接占用后面的地址。这是很危险的,所以strcpy原型中已经声明要为strDest分配足够的空间。
看似简单,其实一点都不简单。
但是如果你把char str1="0123456789“
改写成char str1[13] = "012345678