动态分配的内存可以结构体作为函数返回值值吗

您的举报已经提交成功,我们将尽快处理,谢谢!
public class Test {
public static int a=1;//静态成员变量
//运行结果正常输出1,在java中静态成员变...
大家还关注
<a href="/b/3532891.html" target="_blank" title="一道函数题 某农产品在近30天每吨的销售价格P(元)与时间t(天)的函数关系是
0<t<25,t是自然数
25<等于t<等于30
同时,该农产品的日销售量Q吨与时间t的函数关系是Q=-t+40,0<t一道函数题 某农产品在近30天每吨的销售...
(window.slotbydup=window.slotbydup || []).push({
id: '2081942',
container: s,
size: '1000,60',
display: 'inlay-fix'C语言中怎样把数组返回到函数值?-中国学网-中国IT综合门户网站
> C语言中怎样把数组返回到函数值?
C语言中怎样把数组返回到函数值?
转载 编辑:李强
为了帮助网友解决“C语言中怎样把数组返回到函数值?”相关的问题,中国学网通过互联网对“C语言中怎样把数组返回到函数值?”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:C语言中怎样把数组返回到函数值?,具体解决方案如下:解决方案1:char connect(char a[10]; puts(connect(a;0&#39; if(a[i]==&#39; gets(b).h&gt?谢谢了;10;)}请问怎样修改才能正确做题遇到麻烦了……就是编一个实现strcat函数的功能;void main(){ char a[10];m&lt:#include&&#92; } return c:一个文件中,我做的总是无法运算出最终值……下面是我做的,b));}另一个文件中,char b[10]){ char c[20],m;stdio,char b[10]),c[20],b[10];m++) { c[m+i]=b[m]; gets(a); for(i=0;i&i++) { c[i]=a[i]; } for(m=0;10!;char connect(char a[10]解决方案2:您刚才回答了我一个关于C语言数组方面的疑问,但是又有了一个新的问题……我输入abc和def后另外,我按照您的方法修改之后,程序能正常运行,程序结果为“abcdef 烫烫烫烫烫烫”,而且还出现了一个应用程序错误的对话框……请问这是怎么回事,还没有学习指针…… 二楼您好解决方案3:让函数connect返回类型是第一个数组的地址就可以了 也就是说 connect是一个返回类型为指针的函数声明的时候 char *connect最后返回地址就可以 return 一维数组名;其他的不用变解决方案4:10;n&m++)
{ c[m+i]=b[m],char b[10]) {
char c[20]; void main() {
char a[10]?#include&)stdio你犯的错误有;&#92;i++)
c[i]=a[i],j。我帮你改的程序如下,可以正常运行;
gets(a),m;} void connect(char a[10],你试试看行不;);
if(a[i]==&#39;m&&#92.h&gt,b);10; printf(& void connect(char a[10];)
if(b[m]==&#39,char b[10]),b[10]:每返回一个值都会把前面的值覆盖;j&
gets(b)。所以数组是不能用来返回的,c[20];
} for(j=0;i&0&#39;
connect(a;0&#39;j++) putchar(c[j]);
for(m=0;i+m;&#92解决方案5:可以讲c[]数组定义成全局变量#include&stdio.h& void connect(char a[],char b[]); char c[20];void main() { char a[10],b[10]; gets(a); gets(b); connect(a,b);puts(c);} void connect(char a[],char b[]) { int i,m; for(i=0;i&10;i++) { c[i]=a[i]; if(a[i]==&#39;&#92;0&#39;)
} for(m=0;m&10;m++) { c[m+i]=b[m]; if(b[m]==&#39;&#92;0&#39;)
} }解决方案6:烫烫烫烫烫是因为字符串没有结尾. 在字符串的末尾添加一个符号&&#92;0&就可以了通过对数据库的索引,我们还为您准备了:问:#include&stdio.h& main() { float change(float array[3][3]); float a...答:#include main() { float change(float array[3][3]); float a[3][3]; int i,j; for (i=0;i===========================================问:#include&stdio.h& main() { float change(float array[3][3]); float a...答:可以为指针或着说是地址。 因为对于数组来说只需要传递数组的某个地址例如传递数组a[] 的a或者任意一个地址&a[4]等===========================================问:#include&stdio.h& int **returnNum() { int a[5][5],i,j; for(i=0;i&5;...答:需要动态申请的啊,堆栈上面的数组是不能直接返回的会在函数退出的时候销毁掉#includeint **returnNum(){ int **a,i,j; a = (int**)malloc(5*sizeof(int*)); for(i=0;i===========================================问:#include&stdio.h& int **returnNum() { int a[5][5],i,j; for(i=0;i&5;...答:int *create_array1(){int *p = (int *)malloc(sizeof(int) * 5);for (int i = 0; i & 5; i ++){*(p+i) = i * 2;}}int *create_array2(){int *p = (int *)malloc(sizeof(int) * 5);for (int i = 0; i & 5; i ++){*(p+i) = i * 3;}retur...===========================================问:#include&stdio.h& int **returnNum() { int a[5][5],i,j; for(i=0;i&5;...答:#include main() { float change(float array[3][3]); float a[3][3]; int i,j; for (i=0;i===========================================问:double Y[8]; main() { void rk(); /* 调用rk函数*/ int i,j;...答:你的程序恐怕连编译都不能通过吧,有语法错误。===========================================问:.使用指针来添加两个矩阵和向所得矩阵返回到调用函数写功能。 #include ...答://一、由函数参数带回固定的二维数组 void func(int ppout[][2]) { ppout[0][0] = 1; ppout[0][1] = 2; ppout[1][0] = 3; ppout[1][1] = 4; } int _tmain(int argc, _TCHAR* argv[]) { int pp[2][2]; func(pp); cout ===========================================问:int *sstf(int gap_element,int diskscript[],int num) {······ } void...答:你可以把数组名做参数,直接传入函数操作就可以了,如果非要return的话,操作起来可就麻烦了,要用动态分配才行===========================================问:int *sstf(int gap_element,int diskscript[],int num) {······ } void...答:不能够返回整个数组,只能返回数组中的某个值。如果数组在函数内部定义,也不能直接返回数组名(临时变量在函数结束时会释放)。一般写程序不会把数组作为返回值返回,想要返回整个数组,可以用指针来实现。===========================================你好,返回数组名返回的只能够是数组在内存空间中的首地址位置 建议楼主可以建立全局数组,这样就可以在局部函数中修改数组的值了 有不懂的可以追问~===========================================不能够返回整个数组,只能返回数组中的某个值。如果数组在函数内部定义,也不能直接返回数组名(临时变量在函数结束时会释放)。一般写程序不会把数组作为返回值返回,想要...===========================================子函数只能返回一个值,这个是定下的 要想对数组操作,可以定义全局变量===========================================这个问题一个较为妥善的方法是把数组定义在主函数,再传入数组地址给自定义函数,如... 至于你说要返回指向指针的指针,我举个例子,int** fun(),这个就是返回一个指向指针的指...===========================================你可以把数组名做参数,直接传入函数操作就可以了,如果非要return的话,操作起来可就麻烦了,要用动态分配才行===========================================数组不能直接返回, 如果想要返回一个数组里面的数, 可以在函数里返回一个指向该数组的指针, 通过指针就可以访问数组里的内容了。===========================================int* pi(){static int a[] = {1};int* p =}指向指针的指针 不还是一个指针吗,指针是怎么返回的就怎么返回===========================================// 方法1,用静态变量进行返回 char *SubFunction(void) { static char szText[5] = "adfa"; ... strcpy(pText1, "love"); strcpy(pText2, "you"); } void Caller() // 这个函数调用Sub...=========================================== 数组不可以直接返回,只能通过参数传递出来,比如: void fun(int* p); int main() { int a[100]; fun(a); return 0; } 希望能帮助你。===========================================就是返回一个数组的地址,比如: int* Fun(int pArray[]) { return pA } int pArray[] 作为参数和 int *是一样的 因为不能返回局部变量 函数的返回地址就是形参的 你要知道 你局部变...===========================================
本文欢迎转载,转载请注明:转载自中国学网: []
用户还关注
可能有帮助当前访客身份:游客 [
当前位置:
C语言中,函数参数或者返回值中如果包含指针指向动态分配的内存区域,那么管理申请和释放就显得十分麻烦,一不小心就容易出错,今天突发奇想借鉴高级语言函数式编程的思想,其实C语言里的函数指针已经非常完美了,如果这样写,管理起来就会很方便,callback中无需关注buffer的释放。
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
// 回调函数
// 使用这种技巧,在回调函数中就不用关注缓冲区的释放了
void callback(const char * buffer, int len) {
for (i = 0; i & i++) {
putchar(buffer[i]);
putchar('\n');
void foo(void (* callback)(const char *, int)) {
buffer = (char *)malloc(100);
memset(buffer, 0, 100);
strcpy(buffer, &Hello, World!&);
callback((const char *)buffer, strlen(buffer));
free(buffer);
int main() {
// 下面两种方式都行,不知道为什么
foo(&callback);
foo(callback);
共有7个评论
<span class="a_vote_num" id="a_vote_num_
因为&callback == callback
void foo()可以写成这样比较清晰
typedef void (* callbackPtr)(...) ;
void foo(callbackPtr cb)()&
if (!cb) //还可以检查空值
这种写法在win32里很常见,如CreateThread()就用到
<span class="a_vote_num" id="a_vote_num_
不好意思,没太看懂这个是什么意思。
博主能稍微详细点讲一下吗。
你说用回调函数控制申请和释放内存,可是申请和释放内存并不在回调函数里啊?
<span class="a_vote_num" id="a_vote_num_
&&绑定一个指向函数的空指针 然后用free包装这个函数指针?简单项目写复杂声明 不怕被骂么 呵呵
<span class="a_vote_num" id="a_vote_num_
基本原则还是谁调用, 谁释放, 这里使用的方式是调用者管理内存空间。
<span class="a_vote_num" id="a_vote_num_
基本原则还是谁调用, 谁释放, 这里使用的方式是调用者管理内存空间。
<span class="a_vote_num" id="a_vote_num_
如果callback是异步的,就没有用处了~
<span class="a_vote_num" id="a_vote_num_
感觉没多大用处
更多开发者职位上
有什么技术问题吗?
Mallon...的其它问题
类似的话题页面导航:
→ 正文内容 动态内存分配与释放
C/C++动态分配与释放内存的区别详细解析
以下是对C与C++中动态分配与释放内存的区别进行了详细的分析介绍,需要的朋友可以过来参考下
1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
1.2 void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间,返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。   备注:void* 表示未确定类型的指针,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)
1.3 freevoid free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。
1.4注意事项1)申请了内存空间后,必须检查是否分配成功。
2)当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
3)这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。4)虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。
1.5& malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
2. new运算符
2.1 C++中,用new和delete动态创建和释放数组或单个对象。动态创建对象时,只需指定其数据类型,而不必为该对象命名,new表达式返回指向该新创建对象的指针,我们可以通过指针来访问此对象。int *pi=这个new表达式在堆区中分配创建了一个整型对象,并返回此对象的地址,并用该地址初始化指针pi 。
2.2 动态创建对象的初始化动态创建的对象可以用初始化变量的方式初始化。int *pi=new int(100); //指针pi所指向的对象初始化为100string *ps=new string(10,'9');//*ps 为“”
如果不提供显示初始化,对于类类型,用该类的默认构造函数初始化;而内置类型的对象则无初始化。也可以对动态创建的对象做值初始化:int *pi=new int( );//初始化为0int *pi=//pi 指向一个没有初始化的intstring *ps=new string( );//初始化为空字符串 (对于提供了默认构造函数的类类型,没有必要对其对象进行值初始化)
2.3 撤销动态创建的对象delete表达式释放指针指向的地址空间。// 释放单个对象delete [ ]//释放数组如果指针指向的不是new分配的内存地址,则使用delete是不合法的。
2.4 在delete之后,重设指针的值 //执行完该语句后,p变成了不确定的指针,在很多机器上,尽管p值没有明确定义,但仍然存放了它之前所指对象的地址,然后p所指向的内存已经被释放了,所以p不再有效。此时,该指针变成了悬垂指针(悬垂指针指向曾经存放对象的内存,但该对象已经不存在了)。悬垂指针往往导致程序错误,而且很难检测出来。一旦删除了指针所指的对象,立即将指针置为0,这样就非常清楚的指明指针不再指向任何对象。(零值指针:int *ip=0;)
2.5 区分零值指针和NULL指针零值指针,是值是0的指针,可以是任何一种指针类型,可以是通用变体类型void*也可以是char*,int*等等。空指针,其实空指针只是一种编程概念,就如一个容器可能有空和非空两种基本状态,而在非空时可能里面存储了一个数值是0,因此空指针是人为认为的指针不提供任何地址讯息。
2.6 new分配失败时,返回什么?1993年前,c++一直要求在内存分配失败时operator&& new要返回0,现在则是要求operator&& new抛出std::bad_alloc异常。很多c++程序是在编译器开始支持新规范前写的。c++标准委员会不想放弃那些已有的遵循返回0规范的代码,所以他们提供了另外形式的operator&& new(以及operator&& new[])以继续提供返回0功能。这些形式被称为“无抛出”,因为他们没用过一个throw,而是在使用new的入口点采用了nothrow对象: class&& widget&& {&& ...&& };
widget&& *pw1&& =&& new&&//&& 分配失败抛出std::bad_alloc&&
if&& (pw1&& ==&& 0)&& ... //&& 这个检查一定失败
widget&& *pw2&& =&& new&& (nothrow)&&&& //&& 若分配失败返回0
if&& (pw2&& ==&& 0)&& ... //&& 这个检查可能会成功
3. malloc和new的区别
3.1 new 返回指定类型的指针,并且可以自动计算所需要大小。比如:   1) int *p;   p = //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);   或:   int*   parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;   
2) 而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。   int*   p = (int *) malloc (sizeof(int)*128);//分配128个(可根据实际需要替换该数值)整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中& double *pd=(double *) malloc (sizeof(double)*12);//分配12个double型存储单元,并将首地址存储到指针变量pd中
3.2 malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。
4.有了malloc/free为什么还要new/delete?
1) malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2) 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
3) 既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,结果也会导致程序出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910

我要回帖

更多关于 指针作为函数返回值 的文章

 

随机推荐