2 joyhu1412 JoyHu1412 于 2014.12.10 10:43 提问

指针数组中的malloc用法

#include
#include
void sort(char a[]); //将6,8行去掉 13 14 行a 改为p即可
int main()
{
char *a[5];
char **p;
p = a; //等价于*p=a[0]
int i;
p=(char
*)malloc(5*sizeof(char*)); //这一行不加的话后面的程序就能运行。
for(i=0;i<5;i++){
a[i]=(char*)malloc(20*sizeof(char));
gets(a[i]);}
//请问为什么是这样的呢 为什么p不需要malloc呢 它和二维数组有什么不同?

5个回答

u011767611
u011767611   2014.12.14 16:50
已采纳

看起来你想在堆中分配指针:
你先看看我的代码

#include <stdio.h>
#include <stdlib.h>
void sort(char a[]);
int main(void)
{
    char a[5]="abcd";
    char b[5]="efgh";
    char c[5]="ijkl";
    char d[5]="nmop";
    char e[5]="rstu";

    char * pa[5];

    pa[0]=a;
    pa[1]=b;
    pa[2]=c;
    pa[3]=d;
    pa[4]=e;

    puts(pa[0]);//should output "abcd"
    puts(pa[1]);//should output "efgh"

    char **p;
    p=pa;//just like you p=a

    void **p_void;
    puts(*p);//should output "abcd"

    int i;
    p_void=(char **)malloc(5*sizeof(char*));
    p_void=pa;
    for(i=0;i<5;++i,++p_void)
        puts(*p_void);
    //char ** p;
    //p=a;
    //puts(a[0]);
    //puts(*p);
    return 0;
}


你直接char **p
就已经自动分配内存拉。
看起来你是想像访问普通结构一样申请堆中分配。
如果是这样的话,你应该声明为void类型的然后分配用malloc
然后再赋值。
希望对你有用

happyparrot
happyparrot   Ds   Rxr 2014.12.10 12:48

char a[5]的理解是:数组a[5],其中数组每个成员是char类型。所以,只需要每个数组成员需要为其动态分配空间,但作为数组a,在定义时已经分配了空间,不需要动态分配。p指针指向a数组的首地址,自然也不需要为其动态分配空间。

JoyHu1412
JoyHu1412 作为字符数组 也在定义时已经分配了空间么
大约 3 年之前 回复
zxh707wk
zxh707wk +1
大约 3 年之前 回复
fzs333
fzs333   2014.12.10 11:19

p是二维指针,*p=(char*)malloc(5*sizeof(char*));
或p=(char**)malloc(5*sizeof(char*));

JoyHu1412
JoyHu1412 是我打错啦 我写的时候确实是char** 但还是错的
大约 3 年之前 回复
lxq_xsyu
lxq_xsyu   Rxr 2014.12.10 19:57

我不明白你为什么要有这一行?p=(char*)malloc(5*sizeof(char*));

xiaohuoxiaoer
xiaohuoxiaoer   2014.12.11 10:42

p=a;
p已经有指向的地址了,不用再重新分配内存空间了。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!