首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

strcat函数解决办法

2013-10-07 
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哲学:程序员为自己的行为负责
[解决办法]
引用:
Quote: 引用:

C是不做越界检查的,所以还是运行,但不是正常运行,有可能出错,因为使用了未分配的内存。另外,你的函数返回值没有意义了,请lz仔细看一下。

是标准c不做越界检查吗?这里是数组越界了也不检查?例如:我putchar(s[4])是5,这也不检查?
返回值只是附带的,没有用它


putchar需要一个int型,你给他一个整形,你真好,正好满足我的要求,我可不管你存的啥玩意,也不管是不是你的!我照样输出,无非是个乱码,仅此而已!
测试代码很简单

int main(void)
{
int s[1] = {0};
putchar(s[1]);
return 0;
}

热点排行