晴初back 发表于 2019-4-12 21:11:45

关于动态数组赋值问题

代码为起泡排序,数组定义成动态之后就出现了问题,无论输入什么,最终输出的都是0,数组本身应该没问题,因为最终输出的0的个数是正确的,怀疑是赋值出现了问题,求指点
#include <stdio.h>

int main()
{
        int k,a, t, i, j;
        scanf("%d",&k);
       
        for(i = 0; i < k; i++)
                scanf("%d",&a);
        putchar('\n');
        for(j = 0; j < k-1; j++)
                for(i = 0; i < k-1-j; i++)
                        if(a > a)
                        {
                                t = a;
                                a = a;
                                a = t;
                        }
       
        for(i = 0; i<k; i++)
                printf("%d",a);
       
        return 0;
}

jackz007 发表于 2019-4-12 23:18:16

本帖最后由 jackz007 于 2019-4-12 23:34 编辑

      动态数组在确定元素数量后,还需要使用 malloc() 为数组分配存储空间,楼主的问题出在缺少这个关键环节。
#include <stdio.h>
#include <malloc.h>

main(void)
{
      int k , * a , t , i , j                                    ;
      scanf("%d" , & k)                                          ;
      if((a = (int *) malloc(k * sizeof(int))) != NULL) {         // 楼主少了动态分配内存的手续
                for(i = 0 ; i < k ; i ++) scanf("%d" , & a)   ;
                for(j = 0 ; j < k - 1 ; j ++) {
                        for(i = 0 ; i < k - 1 - j ; i ++) {
                              if(a > a) {
                                        t = a                   ;
                                        a = a            ;
                                        a = t               ;
                              }
                        }
                }
                printf("\n")                                       ;
                for(i = 0 ; i < k ; i ++) printf("%d" , a)    ;
                printf("\n")                                       ;
                free(a)                                          ;// 善始善终
      } else {
                fprintf(stderr , "error : failure of malloc()!\n") ;
      }
}

暗pluto 发表于 2019-4-12 23:21:41

a
然后scanf("%d",&k);
数组不能这样定义
你要定义动态数组,那你可以用malloc
如下
int *a,n;
a= (int *)malloc(n * sizeof(int));

Croper 发表于 2019-4-13 00:02:49

本帖最后由 Croper 于 2019-4-13 00:30 编辑

楼主说的是变长数组(vla)吧,
变长数组和动态数组是两个概念,虽然我感觉也很容易搞混,

问题在于,变长数组这个名字很有误导性,它只是在编译时其数组长度不是常量表达式,长度是变量,
并不是在运行时”变长”的,也就是说,它一旦声明,长度就是固定的。
而你在声明a时,k并没有给予初始值,因此,它的长度你就没法确定。 并且极大可能在赋值的时候发生了越界。从而得到了意外的结果。

因此,你应该把声明a的位置放到k赋值之后,像这样:#include <stdio.h>

int main()
{
      int k,t, i, j;
      scanf("%d",&k);
      int a;
      
      for(i = 0; i < k; i++)
                scanf("%d",&a);
      putchar('\n');
      for(j = 0; j < k-1; j++)
                for(i = 0; i < k-1-j; i++)
                        if(a > a)
                        {
                              t = a;
                              a = a;
                              a = t;
                        }
      
      for(i = 0; i<k; i++)
                printf("%d",a);
      
      return 0;
}

另外,把所有变量在函数开头时进行声明并不是一个好习惯。这种写法只是从c89留下来的习惯而已。现在更推荐在使用变量前再声明变量。这样的程序更有可读性,在实现一个较长的函数时,你也不用在看到一个变量时翻N页去找这个变量的声明。

晴初back 发表于 2019-4-13 12:34:54

Croper 发表于 2019-4-13 00:02
楼主说的是变长数组(vla)吧,
变长数组和动态数组是两个概念,虽然我感觉也很容易搞混,



谢谢,虽然不懂vla是什么,但确实像你说的那样,应该像定义并输入数组个个数然后再定义数组

晴初back 发表于 2019-4-13 12:35:46

暗pluto 发表于 2019-4-12 23:21
a
然后scanf("%d",&k);
数组不能这样定义


谢谢,不过看不懂,其实只要先定义然后输入k就好了

晴初back 发表于 2019-4-13 12:36:30

jackz007 发表于 2019-4-12 23:18
动态数组在确定元素数量后,还需要使用 malloc() 为数组分配存储空间,楼主的问题出在缺少这个关键环 ...

谢谢,简单的方法只要先定义k并输入然后定义数组就好了

Croper 发表于 2019-4-13 12:39:03

本帖最后由 Croper 于 2019-4-13 12:44 编辑

晴初back 发表于 2019-4-13 12:34
谢谢,虽然不懂vla是什么,但确实像你说的那样,应该像定义并输入数组个个数然后再定义数组

vla:variable length array,也就是变长数组,其实看这名字应该叫变量长度数组,这个小特性是c独有而c++不支持的

晴初back 发表于 2019-4-13 13:25:06

Croper 发表于 2019-4-13 12:39
vla:variable length array,也就是变长数组,其实看这名字应该叫变量长度数组,这个小特性是c独有而c ...

Ok 谢谢

暗pluto 发表于 2019-4-13 14:15:05

晴初back 发表于 2019-4-13 12:35
谢谢,不过看不懂,其实只要先定义然后输入k就好了

两种方法都可以
页: [1]
查看完整版本: 关于动态数组赋值问题