鱼C论坛

 找回密码
 立即注册
查看: 5549|回复: 25

C语言动态数组问题

[复制链接]
发表于 2016-7-21 10:49:24 | 显示全部楼层 |阅读模式
3鱼币

        pArr = (struct Student *)malloc(sizeof(struct Student));
        pArr = (struct Student *)malloc(shu * sizeof(struct Student));

第一个动态数组和第二个动态数组有什么区别?

第二个数组我是想让用户自己输入人数在定义,而第一个我数组能输入多个数据吗?

如果我想让用户先输入数据,等数据输入完毕后(我才知道有多少个数据),在定义数组可以吗?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-21 13:21:17 | 显示全部楼层
应该大概可能可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-21 13:29:17 | 显示全部楼层
忘记了,给会鱼c老师了,要用的时候再学回来,不过动态数组是咋回事还是明白的,只是代码都忘记了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-21 14:10:40 | 显示全部楼层
说是动态数组就是用malloc开辟内存而已,用第一种方法只是开辟了一个结构体的内存而已,显然是不行的。你可以写一个程序,每当多存一组数据的时候重新动态开辟一个更大的内存,然后将原来的结构体赋值过去,就实现了动态分配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-21 18:05:51 | 显示全部楼层
Krant5 发表于 2016-7-21 14:10
说是动态数组就是用malloc开辟内存而已,用第一种方法只是开辟了一个结构体的内存而已,显然是不行的。你可 ...

不懂你说什么,能写代码?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-21 19:51:45 | 显示全部楼层
本帖最后由 Krant5 于 2016-7-21 20:06 编辑
学习电脑 发表于 2016-7-21 18:05
不懂你说什么,能写代码?


我猜你的意思是这样?
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>

  4. int main()
  5. {
  6.     typedef struct stu
  7.     {
  8.         char name[10];
  9.         char sex[10];
  10.         int age;
  11.     } stu;
  12.     printf("please input the nums of stu: ");
  13.     int num;
  14.     scanf("%d",&num);
  15.     stu *pArr=(stu *)malloc(sizeof(stu)*num);
  16.     int i=0;
  17.     for(;i<num;i++)
  18.     {
  19.         pArr[i].age=20;
  20.         strcpy(pArr[i].name,"name");
  21.         strcpy(pArr[i].sex,"sex");
  22.     }
  23.     return 0;
  24. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-21 21:48:59 | 显示全部楼层
问题一:
第一个和第二个区别,第一个只是分配出一个Student的大小的内存,而第二个分配的出的内存大小是Student*shu的大小

问题二:
第一个数不能定义多个Student 因为你malloc出来的内存就只是student  ,不可以让用户先输入数据再定义数组,因为你要先申请内存出来存放你输入的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-22 12:33:03 | 显示全部楼层
陌雨 发表于 2016-7-21 21:48
问题一:
第一个和第二个区别,第一个只是分配出一个Student的大小的内存,而第二个分配的出的内存大小是S ...

但是我用第一种方法为什么可以? 我一连输入好多数据都不会错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-23 11:50:37 | 显示全部楼层
第一个问题:两个开辟的内存大小不一样,一个是sizeof(struct Student)这么大,一个是sizeof(struct Student)的shu倍

第二个问题:第一种形式输入多个数据?那只会把原来的数不断覆盖呀,除非你用一个for循环,每次输入数据之前都重新malloc一遍

第三个问题:数组是什么意思?哪里来的数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-24 10:30:14 | 显示全部楼层
shuofxz 发表于 2016-7-23 11:50
第一个问题:两个开辟的内存大小不一样,一个是sizeof(struct Student)这么大,一个是sizeof(struct Studen ...

我是想构建动态数组,  然后让用户自己先输入数据,再来决定数组的大小,可以这样么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-24 10:31:08 | 显示全部楼层
Krant5 发表于 2016-7-21 19:51
我猜你的意思是这样?

我是想,先输入数据再定义动态数组的大小
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-24 10:49:43 | 显示全部楼层
学习电脑 发表于 2016-7-24 10:30
我是想构建动态数组,  然后让用户自己先输入数据,再来决定数组的大小,可以这样么?
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>

  4. void main()
  5. {
  6.      int *array = 0, num, i;
  7.      printf("please input the number of element: ");
  8.      scanf("%d", &num);

  9.      // 申请动态数组使用的内存块
  10.      array = (int *)malloc(sizeof(int)*num);
  11.      if (array == 0)             // 内存申请失败,提示退出
  12.      {
  13.          printf("out of memory,press any key to quit...\n");
  14.          exit(0);             // 终止程序运行,返回操作系统
  15.      }

  16.      // 提示输入num个数据
  17.       printf("please input %d elements: ", num);
  18.       for (i = 0; i < num; i++)
  19.          scanf("%d", &array[i]);

  20.      // 输出刚输入的num个数据
  21.      printf("%d elements are: \n", num);
  22.      for (i = 0; i < num; i++)
  23.          printf("%d,", array[i]);

  24.      printf("\b \n");    // 删除最后一个数字后的分隔符逗号
  25.      free(array);        // 释放由malloc函数申请的内存块
  26. }
复制代码


是这样的意思么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-24 14:17:51 | 显示全部楼层
学习电脑 发表于 2016-7-22 12:33
但是我用第一种方法为什么可以? 我一连输入好多数据都不会错

那要看你源码是怎么写的 如果你把第一句写在while循环里面 那么 每次都是重新分配内存,那每循环一次,你前一次分配出来的内存的就丢失了,你是没办法读出来的,但还是可以每次都录入正常的数据,因为你录入的数据存在了你最新分配的内存里面,你的指针只能找到最新分配的内存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-24 17:18:38 | 显示全部楼层
陌雨 发表于 2016-7-24 14:17
那要看你源码是怎么写的 如果你把第一句写在while循环里面 那么 每次都是重新分配内存,那每循环一次,你 ...

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

struct Student
{
        char name[20];
        int ban;
        int num;
        float score[4];
        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[l].name);
                if (strcmp(pArr[l].name, "ok") && strcmp(pArr[l].name, "OK"))
                {
                    scanf("%d %d %f %f %f %f", &pArr[l].ban,  &pArr[l].num, &pArr[l].score[0], &pArr[l].score[1], &pArr[l].score[2], &pArr[l].score[3]);
                pArr[l].zong = pArr[l].score[0] + pArr[l].score[1] + pArr[l].score[2] + pArr[l].score[3];
                }
            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[m].name, pArr[m].ban, pArr[m].num, pArr[m].score[0], pArr[m].score[1], pArr[m].score[2], pArr[m].score[3], pArr[m].zong, ++d);
        }

          return 0;
}

运行下这程序,为什么我还是可以输出啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-25 12:53:33 | 显示全部楼层
学习电脑 发表于 2016-7-24 10:31
我是想,先输入数据再定义动态数组的大小

你如果不使用他,先创建数组又有什么意义呢?先输入大小再创建就是了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-25 14:35:11 | 显示全部楼层
学习电脑 发表于 2016-7-24 17:18
# include
# include
# include

  pArr = (struct Student *)malloc(sizeof(struct Student));  //你这句只是分配出一个STUDENT节点的内存,那你后面又怎么变成数组了了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-26 09:57:38 | 显示全部楼层
Krant5 发表于 2016-7-25 12:53
你如果不使用他,先创建数组又有什么意义呢?先输入大小再创建就是了

我是说能像我说的那样吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-26 09:58:48 | 显示全部楼层
陌雨 发表于 2016-7-25 14:35
pArr = (struct Student *)malloc(sizeof(struct Student));  //你这句只是分配出一个STUDENT节点的内 ...

我是说我变成数组怎么不会错啊?你运行下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-26 11:26:00 | 显示全部楼层
学习电脑 发表于 2016-7-26 09:57
我是说能像我说的那样吗

你把你认为正确的代码完整发来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-27 10:02:11 | 显示全部楼层
Krant5 发表于 2016-7-26 11:26
你把你认为正确的代码完整发来

楼上有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 02:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表