C语言中,怎么使用malloc函数为数组指针分配空间
比如要为char *p[ ]分配空间,应该怎么弄
指针数组和数组指针是两个不同概念,你这里给出的定义实例实际上是指针数组的定义。
指针数组是指所定义数组的每个数组元素都是一个相应数据类型的指针,开设空间的操作可以应用循环语句进行,例如:对于char *p[10]; 可以应用
for(i=0;i<10;i++)
p[i]=(char *)malloc(sizeof(char)*N); //为每个指针申请开设N字符的存储空间
开设后,对于p的使用与二维数组的使用格式类似,可以有效的使用两个下标,
如 p[0][0]='A';
还可以像每个指针中赋值字符串: p[2]="Beijing"; 当然字符串长度应该小于N。
而数组指针,是指定义为指向某个固定大小顺序空间的指针,定义的格式如下:
char (*pa)[10]; //定义一个指向拥有10元素的字符数组的指针,
int (*p)[10];
应用格式可以参考下述程序,申请空间、赋值、输出后,可以观察到100被赋值到第五行第十个元素,指针可以像二维数组一样通过两个下标引用所申请开设的空间。
#include<alloc.h>
main()
{ int (*p)[10];
int i,j,k;
p=(int(*)[10])malloc(sizeof(int(*)[10])*5); //申请开设5个单元,每个单元拥有10个连续空间
p[4][9]=100;
for(i=0;i<5;i++)
{ for(k=0;k<10;k++)
printf("%8d",p[i][k]);
printf("\n");
}
}
指针数组是指所定义数组的每个数组元素都是一个相应数据类型的指针,开设空间的操作可以应用循环语句进行,例如:对于char *p[10]; 可以应用
for(i=0;i<10;i++)
p[i]=(char *)malloc(sizeof(char)*N); //为每个指针申请开设N字符的存储空间
开设后,对于p的使用与二维数组的使用格式类似,可以有效的使用两个下标,
如 p[0][0]='A';
还可以像每个指针中赋值字符串: p[2]="Beijing"; 当然字符串长度应该小于N。
而数组指针,是指定义为指向某个固定大小顺序空间的指针,定义的格式如下:
char (*pa)[10]; //定义一个指向拥有10元素的字符数组的指针,
int (*p)[10];
应用格式可以参考下述程序,申请空间、赋值、输出后,可以观察到100被赋值到第五行第十个元素,指针可以像二维数组一样通过两个下标引用所申请开设的空间。
#include<alloc.h>
main()
{ int (*p)[10];
int i,j,k;
p=(int(*)[10])malloc(sizeof(int(*)[10])*5); //申请开设5个单元,每个单元拥有10个连续空间
p[4][9]=100;
for(i=0;i<5;i++)
{ for(k=0;k<10;k++)
printf("%8d",p[i][k]);
printf("\n");
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答 2010-12-18
这么再给大家说一下吧:我现在不明白C语言中动态内存分配的意义和作用,给一个已经分配了地址的指针重新分配空间,参数p为原有的空间地址,sizeof(int
第2个回答 2022-05-10
这个回答主要是对@百度网友b452582 和@枫若神明 的补充,感谢及
数组指针版本的完善
malloc版
#include <stdio.h>
#include <stdlib.h>
int main() {
int (*p)[10];
int i, k;
p = (int(*)[10])malloc(sizeof(int[10]) * 5);
//申请开设5个单元,每个单元拥有10个连续空间
//sizeof(int(*)[10])是只是一个地址的长度8byte
for (i = 0; i < 5; i++) {
for (k = 0; k < 10; k++)
p[i][k]=(i+1)*(k+1);
}
p[4][9] = 100;
for (i = 0; i < 5; i++) {
for (k = 0; k < 10; k++)
printf("%d\t",p[i][k]);
printf("\n");
}
return 0;
}
/*
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 100
*/
calloc版#include <stdio.h>
#include <stdlib.h>
int main() {
int (*p)[10];
int i, k;
//void *calloc(size_t num_elements, size_t element_size);
p = (int(*)[10])calloc(sizeof(int), 10 * 5);
p[4][9] = 100;
for (i = 0; i < 5; i++) {
for (k = 0; k < 10; k++)
printf("%d\t",p[i][k]);
printf("\n");
}
return 0;
}
/*
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 100
*/
数组指针版本的完善
malloc版
#include <stdio.h>
#include <stdlib.h>
int main() {
int (*p)[10];
int i, k;
p = (int(*)[10])malloc(sizeof(int[10]) * 5);
//申请开设5个单元,每个单元拥有10个连续空间
//sizeof(int(*)[10])是只是一个地址的长度8byte
for (i = 0; i < 5; i++) {
for (k = 0; k < 10; k++)
p[i][k]=(i+1)*(k+1);
}
p[4][9] = 100;
for (i = 0; i < 5; i++) {
for (k = 0; k < 10; k++)
printf("%d\t",p[i][k]);
printf("\n");
}
return 0;
}
/*
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 100
*/
calloc版#include <stdio.h>
#include <stdlib.h>
int main() {
int (*p)[10];
int i, k;
//void *calloc(size_t num_elements, size_t element_size);
p = (int(*)[10])calloc(sizeof(int), 10 * 5);
p[4][9] = 100;
for (i = 0; i < 5; i++) {
for (k = 0; k < 10; k++)
printf("%d\t",p[i][k]);
printf("\n");
}
return 0;
}
/*
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 100
*/