strcat函数请教大家一个问题,这是一个strcat函数#include stdio.hchar *Strcat(char *s, char *t) {if(s
strcat函数
请教大家一个问题,这是一个strcat函数
#include <stdio.h>
char *Strcat(char *s, char *t)
{
if(s == NULL || t == NULL)
return NULL;
char *temp = s;
while(*s != '\0') s++;
while(*t != '\0') *s++ = *t++;
*s = '\0';
return temp;
}
void main()
{
char s[4] = "123";
char t[4] = "456";
Strcat(s, t);
printf("%s\n", s);
}
按照我的理解,s只能存储4个字符,这里不报错,正常运行,是怎么回事呢? c
[解决办法]C是不做越界检查的,所以还是运行,但不是正常运行,有可能出错,因为使用了未分配的内存。另外,你的函数返回值没有意义了,请lz仔细看一下。
[解决办法]我这用vc 6.0最后会内存报错啊
如果我改成分配在堆上就没问题
void main()
{
char s[4] = "123";
char t[4] = "456";
char *s1=(char *)malloc(sizeof(char));
char *t1=(char *)malloc(sizeof(char));
strcpy(s1,s);
strcpy(t1,t);
Strcat(s1, t1);
printf("%s\n", s1);
}
分配在栈上(楼主)为什么我的就会报错呢。是编译器或电脑原因么。
[解决办法]s[4]是5没有问题,但是没有是s[4]这个元素,换句话说结果是123456\0,前4个元素是使用数组s的存储空间后三个用的是s[3]后面紧挨着的三个存储单元,可是这三个并没有分配给数组s,这是有风险的,c不检查不提示,这是一缺陷,但是使用者必须注意,可能产生未知错误。
[解决办法]“返回值只是附带的,没有用它 ”这句我不是很明白,返回值没有用可以设置void类型,或者不写也行
[解决办法]C语言数组越界,这是程序员的责任,不是语言本身责任,你也不要转移责任到编译器等等其他身上!
无数漏洞都发生在越界上,也是黑客攻击最喜欢的方式之一!
[解决办法]c哲学:程序员为自己的行为负责
[解决办法]putchar需要一个int型,你给他一个整形,你真好,正好满足我的要求,我可不管你存的啥玩意,也不管是不是你的!我照样输出,无非是个乱码,仅此而已!
测试代码很简单
int main(void)
{
int s[1] = {0};
putchar(s[1]);
return 0;
}