主题 : 【已解决】C语言-在子函数内分配的内存,母函数内能用吗?
新新航向
级别: 模拟名流
UID: 294
精华: 1
发帖: 7668
威望: 4 星
金钱: 92 浮游币
贡献值: 54 点
好评度: 12540 点
人气: 74 点
在线时间: 268(时)
注册时间: 2004-03-26
最后登录: 2023-04-11
楼主  发表于: 2006-11-12 20:00

【已解决】C语言-在子函数内分配的内存,母函数内能用吗?

我在WINDOWS XP 下使用turbo C
代码如下
引用
void subfunc(char **dat)
{
  int i, j;

  dat = (char **)malloc(3 * sizeof(char *));

  for (i = 0; i < 3; ++ i)
  {
    dat = (char *)malloc(16);

    for (j = 0; j < 15; ++ j)
      dat[j] = 'a';

    dat[j] = '\0';
  }
}

int main(void)
{
  char **dat = NULL;
  int i;

  subfunc(dat);

  for (i = 0; i < 3; ++ i)
    puts(dat);

  for (i = 0; i < 3; ++ i)
    free(dat);

  free(dat);

  return 0;
}


输出结果是三行乱码,如果将输出代码加入到子函数里则正常输出

子函数内分配的内存,母函数内能用吗?
如果能的话,我该怎样作才能做到这一点?

ps:为什么会出现斜体?
[ 此贴被拉菲尔在2006-11-15 10:38重新编辑 ]
级别: 模拟之星
UID: 17726
精华: 0
发帖: 2664
威望: 0 星
金钱: 2638 浮游币
贡献值: 0 点
好评度: 5506 点
人气: 0 点
在线时间: 695(时)
注册时间: 2005-02-16
最后登录: 2011-09-13
沙发  发表于: 2006-11-13 09:55

不可以。

使用全局变量
虽然你我今生无缘,但我希望在来生再遇见你,即使那时你我已经忘了一切。



新新航向
级别: 模拟名流
UID: 294
精华: 1
发帖: 7668
威望: 4 星
金钱: 92 浮游币
贡献值: 54 点
好评度: 12540 点
人气: 74 点
在线时间: 268(时)
注册时间: 2004-03-26
最后登录: 2023-04-11
板凳  发表于: 2006-11-13 12:29

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

void subfunc(char **dat)
{
  int i, j;

  dat = (char **)malloc(3 * sizeof(char *));

  for (i = 0; i < 3; ++ i)
  {
    dat = (char *)malloc(16);

    for (j = 0; j < 15; ++ j)
      dat[j] = 'a';

    dat[j] = '\0';
  }
}

/*char **dat = NULL;*/

int main(void)
{
  char **dat = NULL;
  int i, j;

/*   subfunc(dat);*/
    dat = (char **)malloc(3 * sizeof(char *));

  for (i = 0; i < 3; ++ i)
  {
    dat = (char *)malloc(16);

    for (j = 0; j < 15; ++ j)
      dat[j] = 'a';

    dat[j] = '\0';
  }

  for (i = 0; i < 3; ++ i)
    puts(dat);

  for (i = 0; i < 3; ++ i)
    free(dat);

  free(dat);

  getch();

  return 0;
}

遗憾,定义全局变量也不行
将子函数代码放到母函数里才可以,
海豚朋友有其他方法吗?
级别: 模拟之星
UID: 17726
精华: 0
发帖: 2664
威望: 0 星
金钱: 2638 浮游币
贡献值: 0 点
好评度: 5506 点
人气: 0 点
在线时间: 695(时)
注册时间: 2005-02-16
最后登录: 2011-09-13
地板  发表于: 2006-11-13 13:48

你没有定义全局变量啊?反正我没有看见。晕!

我不是很喜欢同时用2个*。所以我也不是很明白你的程序。
我随便写了个超级简单的。(VS2005编译)
1和2从本质上是完全一样的。不过我一般只用指针,不用指针的指针。晕!!!

1,
#include "stdafx.h"
#include "stdlib.h"

int itsI=10; //全局变量
char *itsPoint=(char *)malloc((itsI+1));   //全局变量

int main()
{

  int i;
  for(i=0;i<itsI;i++)
  {
    *(itsPoint+i)='a';
  }
  *(itsPoint+i)='\0';
  printf("%s\n",itsPoint);
  free(itsPoint);
  return 0;
}


2,
#include "stdafx.h"
#include "stdlib.h"

int itsI=10; //全局变量
char *itsPoint=(char *)malloc((itsI+1));   //全局变量

void func(char *itsPchr,int itsI);

int main()
{

  int i;
  func(itsPoint,itsI);
  printf("%s\n",itsPoint);
  free(itsPoint);
  return 0;
}

void func(char *itsPchr,int itsI)
{
  int i;
  for(i=0;i<itsI;i++)
  {
    *(itsPchr+i)='a';
  }
  *(itsPchr+i)='\0';
}
[ 此贴被dolphin在2006-11-13 14:10重新编辑 ]
虽然你我今生无缘,但我希望在来生再遇见你,即使那时你我已经忘了一切。



枯れない花
级别: 论坛版主
UID: 11
精华: 0
发帖: 2266
威望: 8 星
金钱: 381185 浮游币
贡献值: 8813 点
好评度: 7896 点
人气: 1049 点
在线时间: 1384(时)
注册时间: 2004-03-24
最后登录: 2023-04-20
草席  发表于: 2006-11-13 22:09

论坛的那个…………防转载的东西……实在是比较讨厌…………
看着乱七八糟……当然,也可能是我用Opera的关系……字比较大……

其实呢,你可以在主函数里面分配内存,然后把这个地址传到子函数里面操作~~这样子,主函数就可以打咯~~~
凡交,近则必相糜以信,远则必忠之以言。
新新航向
级别: 模拟名流
UID: 294
精华: 1
发帖: 7668
威望: 4 星
金钱: 92 浮游币
贡献值: 54 点
好评度: 12540 点
人气: 74 点
在线时间: 268(时)
注册时间: 2004-03-26
最后登录: 2023-04-11
5楼  发表于: 2006-11-14 11:21

是的已改用这种方法

海豚朋友说的全局变量法不能解决以下:指向指针的指针在子函数内二次分配内存(向指针数组分配内存),母函数无法正常访问

ps:
定义char *dat和struct t_dat {char *dat};
这二者在内存使用上有什么区别?
级别: 模拟之星
UID: 17726
精华: 0
发帖: 2664
威望: 0 星
金钱: 2638 浮游币
贡献值: 0 点
好评度: 5506 点
人气: 0 点
在线时间: 695(时)
注册时间: 2005-02-16
最后登录: 2011-09-13
6楼  发表于: 2006-11-14 11:41

我不喜欢用指针的指针,因为我目前还没有发现那样有什么实际意义,我写程序,尽量简单,尽量易懂。
虽然你我今生无缘,但我希望在来生再遇见你,即使那时你我已经忘了一切。



级别: 模拟小生
UID: 133722
精华: 0
发帖: 17
威望: 0 星
金钱: 2560 浮游币
贡献值: 0 点
好评度: 40 点
人气: 0 点
在线时间: 1(时)
注册时间: 2006-08-11
最后登录: 2009-08-23
7楼  发表于: 2006-11-14 13:58

但是别人的程序有这些东西你不会就看不明白啦。
而且你是会有需要用到的一天的。
新新航向
级别: 模拟名流
UID: 294
精华: 1
发帖: 7668
威望: 4 星
金钱: 92 浮游币
贡献值: 54 点
好评度: 12540 点
人气: 74 点
在线时间: 268(时)
注册时间: 2004-03-26
最后登录: 2023-04-11
8楼  发表于: 2006-11-14 15:01

引用
引用第6楼dolphin2006-11-14 11:41发表的“”:
我不喜欢用指针的指针,因为我目前还没有发现那样有什么实际意义,我写程序,尽量简单,尽量易懂。

同意,我也是喜欢傻瓜程序

但是有些底层代码就是使用非常复杂的编程技巧,

为了编写自己的接口只能学习了--

至少在新的解决方法出现以前……
级别: 模拟之星
UID: 17726
精华: 0
发帖: 2664
威望: 0 星
金钱: 2638 浮游币
贡献值: 0 点
好评度: 5506 点
人气: 0 点
在线时间: 695(时)
注册时间: 2005-02-16
最后登录: 2011-09-13
9楼  发表于: 2006-11-14 15:02

需要用到再说。
反正目前不需要。
目前不怎么接触低层。。。。。
虽然你我今生无缘,但我希望在来生再遇见你,即使那时你我已经忘了一切。