c语言-指针数组中的malloc用法

问题描述

指针数组中的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呢 它和二维数组有什么不同?

解决方案

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

#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
然后再赋值。
希望对你有用

解决方案二:

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

解决方案三:

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

解决方案四:

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

解决方案五:

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

时间: 2024-10-04 14:55:55

c语言-指针数组中的malloc用法的相关文章

c语言指针数组 字符串-C语言指针数组查找问题

问题描述 C语言指针数组查找问题 #include#includevoid main(){ void input(char name[]int n); void sort(char *name[]int n); void print(char *name[]int n); void search(char *name[]int n); char *name[4]; int n=4; input(namen); sort(namen); print(namen); search(namen);}v

c语言 指针数组作为函数参数问题

问题描述 c语言 指针数组作为函数参数问题 #include<stdio.h> #include<stdlib.h> void init_rec(day_record *arr[],FILE *file) { char temp[80]; int index=0; while((fscanf(file,"%s",temp))!=EOF) { arr[index]=NULL; arr[index]=(day_record * )malloc(sizeof(day_

C语言 指针数组详解及示例代码_C 语言

如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组.指针数组的定义形式一般为: dataType *arrayName[length]; [ ]的优先级高于*,该定义形式应该理解为: dataType *(arrayName[length]); 括号里面说明arrayName是一个数组,包含了length个元素,括号外面说明每个元素的类型为dataType *. 除了每个元素的数据类型不同,指针数组和普通数组在其他方面都是一样的,下面是一个简单的例子: #include <stdi

c语言-关于C语言 指针数组的小问题

问题描述 关于C语言 指针数组的小问题 指针数组赋值(字符串)后,可以单独引用某一个字符串中的第X个字符(单个字符)吗?输出必须用%s 不能用%c ?? 解决方案 楼主是要这种吗? char *str[3] = {"skjf", "sd", "askjfssf"}; printf("%cn", str[0][3]); //打印出f printf("%cn", *(str[2] + 3));//打印出j 解决

c语言 指针数组与scanf

问题描述 c语言 指针数组与scanf #include#include void get(char p[]){for (int i = 0; i < 3; i++)scanf_s(""%s""p+i10);}void exchange(char *p[]){char *temp;for (int i = 0; i < 2; i++)for (int j = i + 1; j < 3; j++){if ((strcmp(p[i] p[j]))>

c语言-关于C语言指针数组的问题

问题描述 关于C语言指针数组的问题 #include int main(){ int all[5]; int *putin(); int *p=putin(); for(int k=0;k<5;k++,p++) printf("%d ",*p); return 0; } int *putin(){ int array[5]; printf("please enter 5 numbers:"); for(int i = 0;i<5;i++){ scanf(

Javascript数组中push方法用法分析_javascript技巧

本文实例讲述了Javascript数组中push方法用法.分享给大家供大家参考,具体如下: 看下面代码: var o = { 1:'a' ,2:'b' ,length:2 ,push:Array.prototype.push }; o.push('c'); Q:o现在内部的值是什么样子? 我的第一反应是排斥,为什么要研究不合理情况下[解释引擎]的行为?但是这种推论有时候又很吸引人,于是我回来的时候仔细思考了下,发现其实很简单. 对于push这个方法,我条件反射地想到的就是栈,[数据结构的经典栈]

c语言字符数组中回车符问题?

问题描述 c语言字符数组中回车符问题? //getline函数:将一行读入到S中并返回其长度 int getline(char s[] ,int length) { int c,i; for(i=0; i<length-1 && (c=getchar())!=EOF && c!='n';++i) s[i]=c; if(c == 'n'){ s[i] = c; ++i; } s[i]=''; return i; } 我想问一下,这里的if(c =='n')有什么用?我觉

C语言、C++中的union用法总结_C 语言

开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台.忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市.大家都在纠结这个问题,也希望大家和我讨论讨论.别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信.我们每天都在总结那些看似高端的东西,什么设计模式(当然我也有总结了).重构(后期我也会说的了)了,却忽略了那些最基础,最