C语言动态数组问题
pArr = (struct Student *)malloc(sizeof(struct Student));
pArr = (struct Student *)malloc(shu * sizeof(struct Student));
第一个动态数组和第二个动态数组有什么区别?
第二个数组我是想让用户自己输入人数在定义,而第一个我数组能输入多个数据吗?
如果我想让用户先输入数据,等数据输入完毕后(我才知道有多少个数据),在定义数组可以吗?
{:10_249:}应该大概可能可以 忘记了,给会鱼c老师了,要用的时候再学回来,不过动态数组是咋回事还是明白的,只是代码都忘记了 说是动态数组就是用malloc开辟内存而已,用第一种方法只是开辟了一个结构体的内存而已,显然是不行的。你可以写一个程序,每当多存一组数据的时候重新动态开辟一个更大的内存,然后将原来的结构体赋值过去,就实现了动态分配 Krant5 发表于 2016-7-21 14:10
说是动态数组就是用malloc开辟内存而已,用第一种方法只是开辟了一个结构体的内存而已,显然是不行的。你可 ...
不懂你说什么,能写代码? 本帖最后由 Krant5 于 2016-7-21 20:06 编辑
学习电脑 发表于 2016-7-21 18:05
不懂你说什么,能写代码?
我猜你的意思是这样?
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
typedef struct stu
{
char name;
char sex;
int age;
} stu;
printf("please input the nums of stu: ");
int num;
scanf("%d",&num);
stu *pArr=(stu *)malloc(sizeof(stu)*num);
int i=0;
for(;i<num;i++)
{
pArr.age=20;
strcpy(pArr.name,"name");
strcpy(pArr.sex,"sex");
}
return 0;
} 问题一:
第一个和第二个区别,第一个只是分配出一个Student的大小的内存,而第二个分配的出的内存大小是Student*shu的大小
问题二:
第一个数不能定义多个Student 因为你malloc出来的内存就只是student,不可以让用户先输入数据再定义数组,因为你要先申请内存出来存放你输入的数据 陌雨 发表于 2016-7-21 21:48
问题一:
第一个和第二个区别,第一个只是分配出一个Student的大小的内存,而第二个分配的出的内存大小是S ...
但是我用第一种方法为什么可以? 我一连输入好多数据都不会错
第一个问题:两个开辟的内存大小不一样,一个是sizeof(struct Student)这么大,一个是sizeof(struct Student)的shu倍
第二个问题:第一种形式输入多个数据?那只会把原来的数不断覆盖呀,除非你用一个for循环,每次输入数据之前都重新malloc一遍
第三个问题:数组是什么意思?哪里来的数组 shuofxz 发表于 2016-7-23 11:50
第一个问题:两个开辟的内存大小不一样,一个是sizeof(struct Student)这么大,一个是sizeof(struct Studen ...
我是想构建动态数组,然后让用户自己先输入数据,再来决定数组的大小,可以这样么? Krant5 发表于 2016-7-21 19:51
我猜你的意思是这样?
我是想,先输入数据再定义动态数组的大小
学习电脑 发表于 2016-7-24 10:30
我是想构建动态数组,然后让用户自己先输入数据,再来决定数组的大小,可以这样么?
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void main()
{
int *array = 0, num, i;
printf("please input the number of element: ");
scanf("%d", &num);
// 申请动态数组使用的内存块
array = (int *)malloc(sizeof(int)*num);
if (array == 0) // 内存申请失败,提示退出
{
printf("out of memory,press any key to quit...\n");
exit(0); // 终止程序运行,返回操作系统
}
// 提示输入num个数据
printf("please input %d elements: ", num);
for (i = 0; i < num; i++)
scanf("%d", &array);
// 输出刚输入的num个数据
printf("%d elements are: \n", num);
for (i = 0; i < num; i++)
printf("%d,", array);
printf("\b \n"); // 删除最后一个数字后的分隔符逗号
free(array); // 释放由malloc函数申请的内存块
}
是这样的意思么? 学习电脑 发表于 2016-7-22 12:33
但是我用第一种方法为什么可以? 我一连输入好多数据都不会错
那要看你源码是怎么写的 如果你把第一句写在while循环里面 那么 每次都是重新分配内存,那每循环一次,你前一次分配出来的内存的就丢失了,你是没办法读出来的,但还是可以每次都录入正常的数据,因为你录入的数据存在了你最新分配的内存里面,你的指针只能找到最新分配的内存 陌雨 发表于 2016-7-24 14:17
那要看你源码是怎么写的 如果你把第一句写在while循环里面 那么 每次都是重新分配内存,那每循环一次,你 ...
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
struct Student
{
char name;
int ban;
int num;
float score;
float zong;
};
int main(void)
{
int l=0;
struct Student * pArr;
int m, d=0;
int * p;
p = (int *)malloc(sizeof(int));
pArr = (struct Student *)malloc(sizeof(struct Student));
printf("请依次输入学生的姓名,班别,座号,语文成绩,数学成绩,英语成绩,理综成绩(以空格键隔开):\n");
printf("输入完毕后,请输入ok或OK结束!\n");
for (; l>=0; ++l)
{
scanf("%s", pArr.name);
if (strcmp(pArr.name, "ok") && strcmp(pArr.name, "OK"))
{
scanf("%d %d %f %f %f %f", &pArr.ban,&pArr.num, &pArr.score, &pArr.score, &pArr.score, &pArr.score);
pArr.zong = pArr.score + pArr.score + pArr.score + pArr.score;
}
else
break;
}
printf("姓名\t班级\t学号\t语文\t数学\t英语\t理综\t总分\t排名\n");
for (m = 0; m < l; ++m)
{
printf("%s\t%d\t%2d\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%2d\n", pArr.name, pArr.ban, pArr.num, pArr.score, pArr.score, pArr.score, pArr.score, pArr.zong, ++d);
}
return 0;
}
运行下这程序,为什么我还是可以输出啊? 学习电脑 发表于 2016-7-24 10:31
我是想,先输入数据再定义动态数组的大小
你如果不使用他,先创建数组又有什么意义呢?先输入大小再创建就是了 学习电脑 发表于 2016-7-24 17:18
# include
# include
# include
pArr = (struct Student *)malloc(sizeof(struct Student));//你这句只是分配出一个STUDENT节点的内存,那你后面又怎么变成数组了了? Krant5 发表于 2016-7-25 12:53
你如果不使用他,先创建数组又有什么意义呢?先输入大小再创建就是了
我是说能像我说的那样吗 陌雨 发表于 2016-7-25 14:35
pArr = (struct Student *)malloc(sizeof(struct Student));//你这句只是分配出一个STUDENT节点的内 ...
我是说我变成数组怎么不会错啊?你运行下 学习电脑 发表于 2016-7-26 09:57
我是说能像我说的那样吗
你把你认为正确的代码完整发来 Krant5 发表于 2016-7-26 11:26
你把你认为正确的代码完整发来
楼上有
页:
[1]
2