请问,野指针是怎么产生的

happygirl_05 2005-07-06 08:16:35
为什么有的时候直接用strcpy(str1,str2)这样的语句,程序就会出错(运行时出错),这时候只要把str1改为char str1[256];就可以了(char *str1,char *str2)
...全文
424 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsx123 2005-07-10
  • 打赏
  • 举报
回复
不好意思,上面有bug,会memory leak
void tk(const char *const string)
{
char *str1=(char *)malloc(sizeof(char)*strlen(string)+1) ;
strcpy(str1,string);
printf("%s,",str1);
free(str1);//不能少
}
zsx123 2005-07-10
  • 打赏
  • 举报
回复
strcpy(char *,const char*); 函数原型

void tk(const char *const string)
{
char *str1=(char *)malloc(sizeof(char)*strlen(string)+1) ;
strcpy(str1,string);
printf("%s,",str1);
}


void main(void)
{
char *p[]={"1,","2","3"};

for (int i=0;i<3;i++)
{
tk(p[i]);
}

}
zixuefeng_net 2005-07-10
  • 打赏
  • 举报
回复
用指针要谨慎,一定要知道它指向谁,不然会有大问题
logewen 2005-07-10
  • 打赏
  • 举报
回复
晕呐,看书要细心。。。。嘿嘿
login__whf 2005-07-06
  • 打赏
  • 举报
回复
那如果我将char *str1改为char st1[256];为什么打印的时候,会是乱码啊?char str1[256]应该分配空间了呀?
----------------------------------
改成char str1[256]是可以的,再试试吧!
login__whf 2005-07-06
  • 打赏
  • 举报
回复
up
foochow 2005-07-06
  • 打赏
  • 举报
回复
呵呵,学习学习
widespread 2005-07-06
  • 打赏
  • 举报
回复
搞不清楚,我把你的代码执行了一下,好好的,你看看是不是那个细节没注意
happygirl_05 2005-07-06
  • 打赏
  • 举报
回复
那如果我将char *str1改为char st1[256];为什么打印的时候,会是乱码啊?char str1[256]应该分配空间了呀?
happygirl_05 2005-07-06
  • 打赏
  • 举报
回复
我要传的是个字符串 char *p[]={"1,","2","3"}里的"1","2"只是举的例子,所以我必须要用指针数组啊
tk(p[i]); 这样的调用应该没有错吧?
megaboy 2005-07-06
  • 打赏
  • 举报
回复
噢,更正一下,楼主的程序里面char *p[]={"1,","2","3"};声明了一个字符指针数组,看漏眼了。

:(

tk(p[i]);这里没有错。

楼主那个str1是在main里面定义的还是在main外面定义的啊?看你这样用,str1应该在main外面定义为一个全局字符数组才对。
meiqi_fu 2005-07-06
  • 打赏
  • 举报
回复
char* strcpy(char *strDest,char *strSrc)这个库函数应用的前提是目的字符串必须已分配了空间,而你的str1根本就没有分配空间,所以内存出错
megaboy 2005-07-06
  • 打赏
  • 举报
回复
char *str1 ;
char *p[]={"1,","2","3"}; //这里的1后面多了一个逗号
for (int i=0;i<3;i++)
{
tk(p[i]); //这里也错,函数原型的参数是一个指针,p[i]是i这个元素的值,应该改为p
}
void tk(char *string)
{
strcpy(str1,string);
printf("s\n",str1);
}

str1(str1是个全局变量吧?)声明为一重字符指针的时候,系统没有为其分配空间。

看来楼主把一重指针和一维数组搞混了,两者不能看作一样的,虽然两者相似的地方很多,但实质是不同的。
jsjjms 2005-07-06
  • 打赏
  • 举报
回复


1.void tk(char *),你调用的地方是 tk(p[i]),p[i]应该是char 吧。

2.在使用变量的时候不要用系统已经有的关键字。string不要用。

3.strcpy(str1,string);str1没有指向具体的空间,出错。

4.char *p[]是数组指针,好象没有必要这样用吧? char p[] = {'1','2','3'};

5.建议楼主再看看基本书籍。
happygirl_05 2005-07-06
  • 打赏
  • 举报
回复
char *str1 ;
char *p[]={"1,","2","3"};
for (int i=0;i<3;i++)
{
tk(p[i]);
}
void tk(char *string)
{
strcpy(str1,string);
printf("s\n",str1);
}
我大概就是这个意思,这个程序一运行就出错,若把char *str1改为char str1[256];
则打印的是乱码,我错在哪了呀
jsjjms 2005-07-06
  • 打赏
  • 举报
回复
//林博士的文章。

“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。
“野指针”的成因主要有两种:
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如
char *p = NULL;
char *str = (char *) malloc(100);

(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。参见7.5节。

(3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:
class A
{
public:
void Func(void)
{
cout << “Func of class A” << endl;
}
};
void Test(void)
{
A *p;
{
A a;
p = &a; // 注意 a 的生命期
}
p->Func(); // p是“野指针”
}

函数Test在执行语句p->Func()时,对象a已经消失,而p是指向a的,所以p就成了“野指针”。但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。
jsjjms 2005-07-06
  • 打赏
  • 举报
回复
//林博士的文章。

“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。
“野指针”的成因主要有两种:
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如
char *p = NULL;
char *str = (char *) malloc(100);

(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。参见7.5节。

(3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:
class A
{
public:
void Func(void)
{
cout << “Func of class A” << endl;
}
};
void Test(void)
{
A *p;
{
A a;
p = &a; // 注意 a 的生命期
}
p->Func(); // p是“野指针”
}

函数Test在执行语句p->Func()时,对象a已经消失,而p是指向a的,所以p就成了“野指针”。但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。
megaboy 2005-07-06
  • 打赏
  • 举报
回复
野指针指的是未对指针初始化或赋予指针一个未确定的地址,然后使用这个指针。

把str1改为char str1[256]后,str1成为一个数组,系统为其分配了空间。
jsjjms 2005-07-06
  • 打赏
  • 举报
回复
指针要分配空间就可以了。str1 = new char;
而你定义了数组就直接分配了空间。
matthewsky 2005-07-06
  • 打赏
  • 举报
回复
#include <string.h>
#include <iostream.h>

void tk(char *string){
char *dest=new char[15]; //初始化
strcpy(dest,string);
cout<<*dest<<endl;
}

void main(){
char *str1=new char[15] ;
char *p[]={"1","2","3"};
for (int i=0;i<3;i++){
tk(p[i]);
}

}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧