求教字符指针作为函数参数的问题
#include<stdio.h>#include<malloc.h>
#include<stdlib.h>
void catstr(char *dest,char *src);
void main()
{
char *dest,*src="help you?";
src=(char *)malloc(256);
if((dest=(char *)malloc(80))==NULL)
{
printf("no memory\n");
exit(1);
}
dest="Can I ";
catstr(dest,src);
puts(dest);
}
void catstr(char *dest,char *src)
{
int i=0;
while(*dest) dest++;
for(i=0;i<9;i++)
{
*dest=*src;
src++;
dest++;
}
}
以上是我的代码,可是一运行就显示停止运行,单步调试显示这个 test1_4.exe 中的 0x0116151a 处未处理的异常: 0xC0000005: 写入位置 0x011657c6 时发生访问冲突 。
想实现两个字符串连接起来,求各路高手指点怎么实现啊,这个程序是郭天祥那本书的例子,不知道为啥用不了。 内存泄露了。
dest="Can I "; 应该改成strcpy( dest, (char *)"Can I" ) 转一圈回来ls就抢走了沙发... 本帖最后由 aozima 于 2014-4-29 13:05 编辑
welcome_cool 发表于 2014-4-29 10:40
内存泄露了。
dest="Can I "; 应该改成strcpy( dest, (char *)"Can I" )
dest="Can I ";指向只读空间,然后对其进行了写操作。编译器会有警告的,无视者会杯具。
for(i=0;i<9;i++)
{
*dest=*src;这种代码会造成缓冲区溢出,哪天一不小心改错了9,256,80这3个数值的大小,就死了。
dest 先是malloc出来的,然后就直接 dest=“fuck"
这才是内存泄露。
怎么说呢,回炉重练吧。 aozima 发表于 2014-4-29 11:13
指向只读空间,然后对其进行了写操作。编译器会有警告的,无视者死。
这种代码会造成缓冲区溢出,哪天一 ...
看清楚再说了。
dest="Can I "; 应该改成strcpy( dest, (char *)"Can I" ) 。
改成strcpy( dest, (char *)"Can I" ) 还有泄露? 弄了半天发现有几个问题:
1、src指向只读空间,后面又拿去赋值(*dest=*src),是不行的。
2、src先赋值为字符串,然后才malloc,这样指针就变了,不指向字符串了。
作如下修改在C-FREE下编译通过:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include <string.h>
void catstr(char *dest,char *src);
intmain()
{
char *dest;
char *src;
src=(char *)malloc(256);
strcpy(src,"help you?");
if((dest=(char *)malloc(80))==NULL)
{
printf("no memory\n");
exit(1);
}
strcpy(dest,"Can I ");
puts(dest);
puts(src);
catstr(dest,src);
puts(dest);
return 0;
}
void catstr(char *dest,char *src)
{
int i=0;
int slen=strlen(src);
while(*dest) dest++;
for(i=0;i<=slen;i++)
{
*dest=*src;
src++;
dest++;
}
} welcome_cool 发表于 2014-4-29 10:40
内存泄露了。
dest="Can I "; 应该改成strcpy( dest, (char *)"Can I" )
搞定了,大神就是多啊,自己研究了代码半天也没想明白哪写错了,原来是这样溢出了,多谢{:lol:} jzkn 发表于 2014-4-29 13:20
弄了半天发现有几个问题:
1、src指向只读空间,后面又拿去赋值(*dest=*src),是不行的。
2、src先赋值为字 ...
谢大神,用改好的代码,明白了,主要还是对指针理解不够啊,试着一写程序就跑飞。大神,我这个函数指针用完后不需要再释放吗? aozima 发表于 2014-4-29 11:13
指向只读空间,然后对其进行了写操作。编译器会有警告的,无视者会杯具。
这种代码会造成缓冲区溢出,哪 ...
谢大神了{:lol:} srtthree 发表于 2014-4-29 16:29
谢大神,用改好的代码,明白了,主要还是对指针理解不够啊,试着一写程序就跑飞。大神,我这个函数指针用 ...
我不是大神哈,也是看了你的帖子又去重新学习了一下,呵呵。关于释放,可以看下面的从网页上拷贝来的:
只有动态分配的变量需要释放,如用malloc开辟的空间;
静态变量不需要释放,因为他在程序执行过程中一直存在,比如全局变量,和用static修饰的局部变量;
常量也不需要释放,因为他在程序执行过程中一直存在,比如char *p="hello world!";
局部变量也不需要释放,因为他用的是栈上的空间,会随着函数的结束而自动释放。 jzkn 发表于 2014-4-29 16:56
我不是大神哈,也是看了你的帖子又去重新学习了一下,呵呵。关于释放,可以看下面的从网页上拷贝来的:
...
原来如此,懂了,指针用活了还是挺难得。谢了,这个是静态变量不用释放了 必须要释放呀,否则最后成野指针了
页:
[1]