老生常谈问题,还有少许不大明白,请指导。

summerYe 2010-05-24 11:50:48
void getMemory(char *p, int num)//不能正常输出,因为p是str的副本。p指向新内存但str仍然指向NULL
{
p = (char*) malloc(sizeof(char)*num);
};

int main()
{
char *str = NULL;
getMemory(str,100);
strcpy(str,"hello");
return 0;
}



char *getMemory(char *p, int num)//能正常输出
{
p = (char*) malloc(sizeof(char)*num);
return p;
};

...全文
237 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
patricxuqi 2010-05-24
  • 打赏
  • 举报
回复
你在被调用函数里面申请的内存,返回时自动被回收!
liutengfeigo 2010-05-24
  • 打赏
  • 举报
回复
不知道这个函数可以解释不?
#include <iostream>
#include <string>
using namespace std;
string fun(string p)
{ p.reserve(88);
return p;
}

int main(void)
{ string a = "dsaaa";
cout << a.capacity() << endl;//a的内存长度是5
a.reserve(100);
cout << a.capacity() << endl; 内存长度是100
string c = fun(a);
cout << a.capacity() << endl; 内存长度是100
cout << c.capacity() << endl; 内存长度是88.
system("pause");
return 0;
}
我是菜鸟,错了。别怪我
liutengfeigo 2010-05-24
  • 打赏
  • 举报
回复
我是菜鸟,看了楼主的问题后我也被迷惑住了,正在看。。。。学习 学习
lirg8405 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lthyxy 的回复:]
谁帮我解释一下。我这函数为什么结果会是 4 4 is OK
[/Quote]
本来不想回你的问题,但是你在这里扰乱楼主的思维;
为什么会是4,4,是因为你的函数
int * fun(int * p)
{ *p = 4;
return p;
}
直接把P指向的地址的值给改了,和楼主的就不是一个概念的
skyworth98 2010-05-24
  • 打赏
  • 举报
回复
C/C++的参数传递都是传值,也就是说,将参数的值传递给被调用函数。
被调用函数修改的只是他本地的一份拷贝,而不是原始值。

[Quote=引用楼主 summerye 的回复:]
C/C++ code
void getMemory(char **p, int num)//不能正常输出,因为p是str的副本。p指向新内存但str仍然指向NULL
{
*p = (char*) malloc(sizeof(char)*num);
};

int main()
{
char *str = NULL;
getMemory(str,100);
……
[/Quote]
skyworth98 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 summerye 的回复:]
C/C++ code
void getMemory(char **p, int num)//不能正常输出,因为p是str的副本。p指向新内存但str仍然指向NULL
{
p = (char*) malloc(sizeof(char)*num);
};

int main()
{
char *str = NULL;
getMemory(str,100);
……
[/Quote]
liutengfeigo 2010-05-24
  • 打赏
  • 举报
回复
这个你对指针的传值以及返回值都不太了解,实际上无论是传一个指针还是返回一个指针都是将这个指针复制一份副本。确切的说是将这个指针里面包含的地址复制一遍
liutengfeigo 2010-05-24
  • 打赏
  • 举报
回复
if ( &a == c) cout << "is OK" << endl;
a地址 与 C 的地址是同一块啊?
liutengfeigo 2010-05-24
  • 打赏
  • 举报
回复
谁帮我解释一下。我这函数为什么结果会是 4 4 is OK
rwjlqn 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 summerye 的回复:]
问题1:函数结束后指针P会不会被销毁,有些高手博客说销毁,有的说不销毁?
问题2:在第二种方法中str是得到p返回值吗?或更可能是其拷贝?那么是说str也指向这块内存?
[/Quote]
1:大多数便一起上没有销毁
2.是其拷贝
liutengfeigo 2010-05-24
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
int * fun(int * p)
{ *p = 4;
return p;
}

int main(void)
{ int a = 2;
int *c = fun(&a);
cout << *c << endl;
cout << a << endl;
if ( &a == c) cout << "is OK" << endl;
system("pause");
return 0;
}
楼主看这函数。。。
KID_coder 2010-05-24
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *getMemory(char *p, int num)//能正常输出
{
p = (char*) malloc(sizeof(char)*num);
return p;
}
/*
void getMemory(char *p, int num)//不能正常输出,因为p是str的副本。p指向新内存但str仍然指向NULL
{
p = (char*) malloc(sizeof(char)*num);
}*/

int main()
{
char *str = NULL;
getMemory(str,100);
strcpy(str,"hello");
printf("%s\n",str);
return 0;
}

加上printf后一样出错~复制没有不成功
liutengfeigo 2010-05-24
  • 打赏
  • 举报
回复
问题2:在第二种方法中str是得到p返回值吗?或更可能是其拷贝?那么是说str也指向这块内存?
#include <iostream>
using namespace std;
int * fun(int * p)
{ *p = 4;
return p;
}
int main(void)
{ int a = 2;
int *c = fun(&a);
cout << *c << endl;
cout << a << endl;
system("pause");
return 0;
}
结果是4, 4。
lirg8405 2010-05-24
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;

char *getMemory(char *p, int num)//能正常输出
{
p = (char*) malloc(sizeof(char)*num);
return p;
};
int main()
{
char *str = NULL;
getMemory(str,100);
strcpy(str,"hello");
return 0;
}

我这样用你的运行出错,为什么你可以???
lirg8405 2010-05-24
  • 打赏
  • 举报
回复
问题2:为什么可以,我也搞不清楚,等待高手...
lirg8405 2010-05-24
  • 打赏
  • 举报
回复
问题1:堆中申请的内存都不会自动释放,在程序结束的时候,有可能系统会回收
summerYe 2010-05-24
  • 打赏
  • 举报
回复
刚发问题贴就有几个人比我先回了。我的问题在四楼,谢谢几位。
summerYe 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lirg8405 的回复:]
void getMemory(char *p, int num)//不能正常输出,因为p是str的副本。p指向新内存但str仍然指向NULL
{
p = (char*) malloc(sizeof(char)*num);
};
使用二级指针或者是指针的引用
void getMemory(char **p, int num)//二级指针
{
(*p) = (char*) mal……
[/Quote]很感谢,你这种方法我了解。我的问题在四楼不过三楼说我对函数机制不了解也是实情。
summerYe 2010-05-24
  • 打赏
  • 举报
回复
问题1:函数结束后指针P会不会被销毁,有些高手博客说销毁,有的说不销毁?
问题2:在第二种方法中str是得到p返回值吗?或更可能是其拷贝?那么是说str也指向这块内存?
pengzhixi 2010-05-24
  • 打赏
  • 举报
回复
这个你对指针的传值以及返回值都不太了解,实际上无论是传一个指针还是返回一个指针都是将这个指针复制一份副本。确切的说是将这个指针里面包含的地址复制一遍
加载更多回复(14)
具体内容参考我的BLOG:http://blog.csdn.net/smallwhiteyt/archive/2009/11/08/4784771.aspx 如果你耐心仔细看完本文,相信以后再遇到导出EXCLE操作的时候你会很顺手觉得SO EASY,主要给新手朋友们看的,老鸟可以直接飘过了,花了一晚上的时间写的很辛苦,如果觉得对你有帮助烦留言支持一下,我会写更多基础的原创内容来回报大家。 C#导出数据到EXCEL表格是个老生常谈问题了,写这篇文章主要是给和我一样的新手朋友提供两种导出EXCEL的方法并探讨一下导出的效率问题,本文中的代码直接就可用,其中部分代码参考其他的代码并做了修改,抛砖引玉,希望大家一起探讨,如有不对的地方还大家多多包涵并指出来,我也是个新手,出错也是难免的。 首先先总结下自己知道的导出EXCEL表格的方法,大致有以下几种,有疏漏的大家补充。 1.数据逐条逐条的写入EXCEL 2.通过OLEDB把EXCEL做为数据源来写 3.通过RANGE范围写入多行多列内存数据到EXCEL 4.利用系统剪贴板写入EXCEL 好了,我想这些方法已经足够完成我们要实现的功能了,方法不在多,在精,不是么?以上4中方法都可以实现导出EXCEL,方法1为最基础的方法,意思就是效率可能不是太高,当遇到数据量过大时所要付出的时间也是巨大的,后面3种方法都是第一种的衍生,在第一种方法效率低下的基础上改进的,这里主要就是一个效率问题了,当然如果你数据量都很小,我想4种方法就代码量和复杂程度来说第1种基本方法就可以了,或当你的硬件非常牛逼了,那再差的方法也可以高效的完成也没有探讨的实际意义了,呵呵说远了,本文主要是在不考虑硬件或同等硬件条件下单从软件角度出发探讨较好的解决方案。

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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