学习电脑 发表于 2016-7-21 10:49:24

C语言动态数组问题


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

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

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

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

冷酷° 发表于 2016-7-21 13:21:17

{:10_249:}应该大概可能可以

donkkong 发表于 2016-7-21 13:29:17

忘记了,给会鱼c老师了,要用的时候再学回来,不过动态数组是咋回事还是明白的,只是代码都忘记了

Krant5 发表于 2016-7-21 14:10:40

说是动态数组就是用malloc开辟内存而已,用第一种方法只是开辟了一个结构体的内存而已,显然是不行的。你可以写一个程序,每当多存一组数据的时候重新动态开辟一个更大的内存,然后将原来的结构体赋值过去,就实现了动态分配

学习电脑 发表于 2016-7-21 18:05:51

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

不懂你说什么,能写代码?

Krant5 发表于 2016-7-21 19:51:45

本帖最后由 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;
}

陌雨 发表于 2016-7-21 21:48:59

问题一:
第一个和第二个区别,第一个只是分配出一个Student的大小的内存,而第二个分配的出的内存大小是Student*shu的大小

问题二:
第一个数不能定义多个Student 因为你malloc出来的内存就只是student,不可以让用户先输入数据再定义数组,因为你要先申请内存出来存放你输入的数据

学习电脑 发表于 2016-7-22 12:33:03

陌雨 发表于 2016-7-21 21:48
问题一:
第一个和第二个区别,第一个只是分配出一个Student的大小的内存,而第二个分配的出的内存大小是S ...

但是我用第一种方法为什么可以? 我一连输入好多数据都不会错

shuofxz 发表于 2016-7-23 11:50:37

第一个问题:两个开辟的内存大小不一样,一个是sizeof(struct Student)这么大,一个是sizeof(struct Student)的shu倍

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

第三个问题:数组是什么意思?哪里来的数组

学习电脑 发表于 2016-7-24 10:30:14

shuofxz 发表于 2016-7-23 11:50
第一个问题:两个开辟的内存大小不一样,一个是sizeof(struct Student)这么大,一个是sizeof(struct Studen ...

我是想构建动态数组,然后让用户自己先输入数据,再来决定数组的大小,可以这样么?

学习电脑 发表于 2016-7-24 10:31:08

Krant5 发表于 2016-7-21 19:51
我猜你的意思是这样?

我是想,先输入数据再定义动态数组的大小

shuofxz 发表于 2016-7-24 10:49:43

学习电脑 发表于 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-24 14:17:51

学习电脑 发表于 2016-7-22 12:33
但是我用第一种方法为什么可以? 我一连输入好多数据都不会错

那要看你源码是怎么写的 如果你把第一句写在while循环里面 那么 每次都是重新分配内存,那每循环一次,你前一次分配出来的内存的就丢失了,你是没办法读出来的,但还是可以每次都录入正常的数据,因为你录入的数据存在了你最新分配的内存里面,你的指针只能找到最新分配的内存

学习电脑 发表于 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;
        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;
}

运行下这程序,为什么我还是可以输出啊?

Krant5 发表于 2016-7-25 12:53:33

学习电脑 发表于 2016-7-24 10:31
我是想,先输入数据再定义动态数组的大小

你如果不使用他,先创建数组又有什么意义呢?先输入大小再创建就是了

陌雨 发表于 2016-7-25 14:35:11

学习电脑 发表于 2016-7-24 17:18
# include
# include
# include


pArr = (struct Student *)malloc(sizeof(struct Student));//你这句只是分配出一个STUDENT节点的内存,那你后面又怎么变成数组了了?

学习电脑 发表于 2016-7-26 09:57:38

Krant5 发表于 2016-7-25 12:53
你如果不使用他,先创建数组又有什么意义呢?先输入大小再创建就是了

我是说能像我说的那样吗

学习电脑 发表于 2016-7-26 09:58:48

陌雨 发表于 2016-7-25 14:35
pArr = (struct Student *)malloc(sizeof(struct Student));//你这句只是分配出一个STUDENT节点的内 ...

我是说我变成数组怎么不会错啊?你运行下

Krant5 发表于 2016-7-26 11:26:00

学习电脑 发表于 2016-7-26 09:57
我是说能像我说的那样吗

你把你认为正确的代码完整发来

学习电脑 发表于 2016-7-27 10:02:11

Krant5 发表于 2016-7-26 11:26
你把你认为正确的代码完整发来

楼上有
页: [1] 2
查看完整版本: C语言动态数组问题