C++ 运行出错了,但是不知道错哪里了

梦是多么的重要 2013-05-10 10:51:40


谁能告诉我这是为什么,比较小白的问题。来个人告诉下,记性不好,实在记不起这有什么错。。。
...全文
408 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010655054 2013-05-11
  • 打赏
  • 举报
回复
新注册的号,好像发表不了文章,可能可以发表,所以在这里用回复的方式来提问题
u010655054 2013-05-11
  • 打赏
  • 举报
回复
u010655054 2013-05-11
  • 打赏
  • 举报
回复
#include <iostream> using namespace std; char * fun(int n) { int jiao=n; int size=0; while(jiao/10) { jiao/=10; size++; } char *b=new char[++size]; //这里申请的内存,在这个函数结束时没有被释放 int nu=size; //如里用这样定义b:char*b; 则会出错 ,如何改进才可以释放内存 while(size--) { b[size]=n%10+'0'; n/=10; } b[nu]='\0'; return b; } int main() { char *b; b=fun(524524); cout<<b<<endl; return 0; }
hugett 2013-05-10
  • 打赏
  • 举报
回复
你的数据成员都没有初始化就在友元中使用了。。
十八道胡同 2013-05-10
  • 打赏
  • 举报
回复
int num; int moon; 没初始化,是随机值
忘世麒麟 2013-05-10
  • 打赏
  • 举报
回复
设置一个构造函数初始化你的变量即可,如:

#include <iostream>
using namespace std;
class fish{
public:
	friend void breath(fish&);
	friend void love(fish X);
	fish():num(0),moon(1){};
private:
	int num;
	int moon;
};
void breath(fish &t)
{
	cout <<t.num<<endl;
}
void love(fish x)
{
	cout<<x.moon<<endl;
}
void main()
{
	fish st1;
	love(st1);
	breath(st1);
}
zybjtu 2013-05-10
  • 打赏
  • 举报
回复
你的stl里面的成员都没有初始化,还是随机值,就是num和moon
  • 打赏
  • 举报
回复
引用 2 楼 chuachua66 的回复:
点一下retry看一下栈呗。
retry? 不知道啊啊啊。 我现在知道了,就是没用 & 引用,因为 用了 t.moon
chuachua66 2013-05-10
  • 打赏
  • 举报
回复
点一下retry看一下栈呗。
  • 打赏
  • 举报
回复
今天早上闲来无聊,做了个测试。。。把之前看的书 加深下,然后 自己尝试各种另类办法,但是到这里,就。。。。。。。。。 坐等解答
  • 打赏
  • 举报
回复
引用 23 楼 baijiaheizhiganmao 的回复:
我建议你看书的时候一定要坐在编译器旁边,将书上的每个例题敲一遍,将书后面的每道习题敲一遍,光看书是没有用的,很容易犯下丢三落四、张冠李戴的错误。 其次,将你遇到的每个错误记录下来,比如这个问题,标记上它的原因和解决方法。对初学者这个很有用。
苦逼大专生,不容易。当初不努力, 现在 自学编程,然后 周围都是玩游戏的,太吵,看书只能去图书馆。。 自学嘛,没那么多经验,现在 你说的这些 技巧 我都体会到了。。的确是这样。。。 O(∩_∩)O谢谢
  • 打赏
  • 举报
回复
已结贴,谢谢各路神仙,只有100分,我也想多给点。。但是不支持。。。 不是我抠门哈。。。
忘世麒麟 2013-05-10
  • 打赏
  • 举报
回复
我建议你看书的时候一定要坐在编译器旁边,将书上的每个例题敲一遍,将书后面的每道习题敲一遍,光看书是没有用的,很容易犯下丢三落四、张冠李戴的错误。 其次,将你遇到的每个错误记录下来,比如这个问题,标记上它的原因和解决方法。对初学者这个很有用。
  • 打赏
  • 举报
回复
引用 17 楼 hugett 的回复:
[quote=引用 13 楼 luoxuechengbing2012 的回复:] [quote=引用 7 楼 hugett 的回复:] 你的数据成员都没有初始化就在友元中使用了。。
这位神仙,弱弱的问下:既然 prvate 变量 只能在 基类和友元中访问,那么 我们定位 prvate变量的作用意义何在? 在 基类里 写一个成员函数:

  class Test{
   public: 
     void Test()
{   int num=0;       }
    void Message()
{
   cout<<num<<endl;
}
  prvate:
       int num; 
};
  void main()
{
   Test t;
   t.Meassage();
}
比如这段 不科学,错得离谱的 代码来看, 我想输出 private 里面的成员变量我该如何去实现呢? 当然,不用 friend 实现。 我就是搞不懂 为什么 我把 成员变量给了 成员函数,然后由外部去调用成员函数会出现各种错误。。 [/quote] private成员就是为了不让类的用户获得类的实现细节。。只能通过类的接口,也就是public成员访问类对象。。你要明白。。你写的类是可能会被其他人使用的。。 而且,由于用户只能通过接口访问类对象,当你需要对类的定义进行修改的时候,只要不改动接口,用户代码就不需要修改。。这可以减少工作量。。 另外,你那段代码。。我帮你改了一下。。

#include <iostream>

using namespace std;

class Test{
public: 
	Test(){num=0;}
	void Message(){cout<<num<<endl;}//在类成员函数中输出num。。
	int getnum() const{ return num;}//返回num给类的用户
private:
	int num; 
};
void main()
{
   Test t;
   t.Message();
   cout<<t.getnum()<<endl;
}
[/quote] 懂了,庸才一枚,问的问题有点奇葩。。。 只看书不实践的下场,书看多了就杂了。。所以 各种问题又,,我得努力去实践,一段时间放下书本。。 O(∩_∩)O~ 谢谢你们哈!
lsjfdjoijvtghu 2013-05-10
  • 打赏
  • 举报
回复
好亲切的using namespace std;
  • 打赏
  • 举报
回复
引用 19 楼 baijiaheizhiganmao 的回复:
[quote=引用 18 楼 luoxuechengbing 的回复:] [quote=引用 16 楼 baijiaheizhiganmao 的回复:] 首先你的这段代码

 class Test{
   public: 
     void Test()
{   int num=0;       }
    void Message()
{
   cout<<num<<endl;
}
  prvate:
       int num; 
};
  void main()
{
   Test t;
   t.Meassage();
}
很粗心看到没有红色部分你并没有给private里面的num赋值而是给一个临时局部变量赋值(你不应该添加int),这样message函数就输出了一个没有初始化的变量.程序崩溃了. 其次"我们定位 prvate变量的作用意义何在"这个我想你去找本C++的书就行了.
prvate的意义 书上无非就是 不让 派生以及用户程序去访问,保护数据安全? 那么 我没有给 prvate里的 num赋值,难道我的这种 构造函数式定义的一个 局部变量吗?仅仅给了局部变量赋值? 要给 Prvate里的num 赋值 只有通过Test():num(0){};吗?[/quote] 你没有明白我的意思.我的意思是你这样做是错的,没有给num赋值:

void Test()       //首先构造函数不应该加上发挥类型void
{  
	int num=0; //错误,你没有个类的num变量赋值,而是给了另一个局部临时变量赋值.
				//因为你在这是声明了一个临时的num.
}
[code=c]
你应该这样:
Test() { num=0; } [/code] 或者Test():num(0){} 都行啊. [/quote] 哦哦,好的。谢谢,懂了。。秒懂,,记性不好。。
忘世麒麟 2013-05-10
  • 打赏
  • 举报
回复
引用 18 楼 luoxuechengbing 的回复:
[quote=引用 16 楼 baijiaheizhiganmao 的回复:] 首先你的这段代码

 class Test{
   public: 
     void Test()
{   int num=0;       }
    void Message()
{
   cout<<num<<endl;
}
  prvate:
       int num; 
};
  void main()
{
   Test t;
   t.Meassage();
}
很粗心看到没有红色部分你并没有给private里面的num赋值而是给一个临时局部变量赋值(你不应该添加int),这样message函数就输出了一个没有初始化的变量.程序崩溃了. 其次"我们定位 prvate变量的作用意义何在"这个我想你去找本C++的书就行了.
prvate的意义 书上无非就是 不让 派生以及用户程序去访问,保护数据安全? 那么 我没有给 prvate里的 num赋值,难道我的这种 构造函数式定义的一个 局部变量吗?仅仅给了局部变量赋值? 要给 Prvate里的num 赋值 只有通过Test():num(0){};吗?[/quote] 你没有明白我的意思.我的意思是你这样做是错的,没有给num赋值:

void Test()       //首先构造函数不应该加上发挥类型void
{  
	int num=0; //错误,你没有个类的num变量赋值,而是给了另一个局部临时变量赋值.
				//因为你在这是声明了一个临时的num.
}
[code=c]
你应该这样:
Test() { num=0; } [/code] 或者Test():num(0){} 都行啊.
  • 打赏
  • 举报
回复
引用 16 楼 baijiaheizhiganmao 的回复:
首先你的这段代码

 class Test{
   public: 
     void Test()
{   int num=0;       }
    void Message()
{
   cout<<num<<endl;
}
  prvate:
       int num; 
};
  void main()
{
   Test t;
   t.Meassage();
}
很粗心看到没有红色部分你并没有给private里面的num赋值而是给一个临时局部变量赋值(你不应该添加int),这样message函数就输出了一个没有初始化的变量.程序崩溃了. 其次"我们定位 prvate变量的作用意义何在"这个我想你去找本C++的书就行了.
prvate的意义 书上无非就是 不让 派生以及用户程序去访问,保护数据安全? 那么 我没有给 prvate里的 num赋值,难道我的这种 构造函数式定义的一个 局部变量吗?仅仅给了局部变量赋值? 要给 Prvate里的num 赋值 只有通过Test():num(0){};吗?
hugett 2013-05-10
  • 打赏
  • 举报
回复
引用 13 楼 luoxuechengbing2012 的回复:
[quote=引用 7 楼 hugett 的回复:] 你的数据成员都没有初始化就在友元中使用了。。
这位神仙,弱弱的问下:既然 prvate 变量 只能在 基类和友元中访问,那么 我们定位 prvate变量的作用意义何在? 在 基类里 写一个成员函数:

  class Test{
   public: 
     void Test()
{   int num=0;       }
    void Message()
{
   cout<<num<<endl;
}
  prvate:
       int num; 
};
  void main()
{
   Test t;
   t.Meassage();
}
比如这段 不科学,错得离谱的 代码来看, 我想输出 private 里面的成员变量我该如何去实现呢? 当然,不用 friend 实现。 我就是搞不懂 为什么 我把 成员变量给了 成员函数,然后由外部去调用成员函数会出现各种错误。。 [/quote] private成员就是为了不让类的用户获得类的实现细节。。只能通过类的接口,也就是public成员访问类对象。。你要明白。。你写的类是可能会被其他人使用的。。 而且,由于用户只能通过接口访问类对象,当你需要对类的定义进行修改的时候,只要不改动接口,用户代码就不需要修改。。这可以减少工作量。。 另外,你那段代码。。我帮你改了一下。。

#include <iostream>

using namespace std;

class Test{
public: 
	Test(){num=0;}
	void Message(){cout<<num<<endl;}//在类成员函数中输出num。。
	int getnum() const{ return num;}//返回num给类的用户
private:
	int num; 
};
void main()
{
   Test t;
   t.Message();
   cout<<t.getnum()<<endl;
}
忘世麒麟 2013-05-10
  • 打赏
  • 举报
回复
首先你的这段代码

 class Test{
   public: 
     void Test()
{   int num=0;       }
    void Message()
{
   cout<<num<<endl;
}
  prvate:
       int num; 
};
  void main()
{
   Test t;
   t.Meassage();
}
很粗心看到没有红色部分你并没有给private里面的num赋值而是给一个临时局部变量赋值(你不应该添加int),这样message函数就输出了一个没有初始化的变量.程序崩溃了. 其次"我们定位 prvate变量的作用意义何在"这个我想你去找本C++的书就行了.
加载更多回复(8)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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