鱼C论坛

 找回密码
 立即注册
查看: 2819|回复: 9

[已解决]关于动态数组赋值问题

[复制链接]
发表于 2019-4-12 21:11:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

  2. int main()
  3. {
  4.         int k,a[k], t, i, j;
  5.         scanf("%d",&k);
  6.        
  7.         for(i = 0; i < k; i++)
  8.                 scanf("%d",&a[i]);
  9.         putchar('\n');
  10.         for(j = 0; j < k-1; j++)
  11.                 for(i = 0; i < k-1-j; i++)
  12.                         if(a[i] > a[i+1])
  13.                         {
  14.                                 t = a[i];
  15.                                 a[i] = a[i+1];
  16.                                 a[i+1] = t;
  17.                         }
  18.        
  19.         for(i = 0; i<k; i++)
  20.                 printf("%d  ",a[i]);
  21.        
  22.         return 0;
  23. }
复制代码
最佳答案
2019-4-13 00:02:49
本帖最后由 Croper 于 2019-4-13 00:30 编辑

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

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

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

  2. int main()
  3. {
  4.         int k,t, i, j;
  5.         scanf("%d",&k);
  6.         int a[k];
  7.         
  8.         for(i = 0; i < k; i++)
  9.                 scanf("%d",&a[i]);
  10.         putchar('\n');
  11.         for(j = 0; j < k-1; j++)
  12.                 for(i = 0; i < k-1-j; i++)
  13.                         if(a[i] > a[i+1])
  14.                         {
  15.                                 t = a[i];
  16.                                 a[i] = a[i+1];
  17.                                 a[i+1] = t;
  18.                         }
  19.         
  20.         for(i = 0; i<k; i++)
  21.                 printf("%d  ",a[i]);
  22.         
  23.         return 0;
  24. }
复制代码


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

使用道具 举报

发表于 2019-4-12 23:18:16 | 显示全部楼层
本帖最后由 jackz007 于 2019-4-12 23:34 编辑

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

  3. main(void)
  4. {
  5.         int k , * a , t , i , j                                    ;
  6.         scanf("%d" , & k)                                          ;
  7.         if((a = (int *) malloc(k * sizeof(int))) != NULL) {           // 楼主少了动态分配内存的手续
  8.                 for(i = 0 ; i < k ; i ++) scanf("%d" , & a[i])     ;
  9.                 for(j = 0 ; j < k - 1 ; j ++) {
  10.                         for(i = 0 ; i < k - 1 - j ; i ++) {
  11.                                 if(a[i] > a[i + 1]) {
  12.                                         t = a[i]                   ;
  13.                                         a[i] = a[i + 1]            ;
  14.                                         a[i + 1] = t               ;
  15.                                 }
  16.                         }
  17.                 }
  18.                 printf("\n")                                       ;
  19.                 for(i = 0 ; i < k ; i ++) printf("%d  " , a[i])    ;
  20.                 printf("\n")                                       ;
  21.                 free(a)                                            ;  // 善始善终
  22.         } else {
  23.                 fprintf(stderr , "error : failure of malloc()!\n") ;
  24.         }
  25. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-12 23:21:41 | 显示全部楼层
a[k]
然后scanf("%d",&k);
数组不能这样定义
你要定义动态数组,那你可以用malloc
如下
int *a,n;
a= (int *)malloc(n * sizeof(int));
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-13 00:02:49 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Croper 于 2019-4-13 00:30 编辑

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

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

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

  2. int main()
  3. {
  4.         int k,t, i, j;
  5.         scanf("%d",&k);
  6.         int a[k];
  7.         
  8.         for(i = 0; i < k; i++)
  9.                 scanf("%d",&a[i]);
  10.         putchar('\n');
  11.         for(j = 0; j < k-1; j++)
  12.                 for(i = 0; i < k-1-j; i++)
  13.                         if(a[i] > a[i+1])
  14.                         {
  15.                                 t = a[i];
  16.                                 a[i] = a[i+1];
  17.                                 a[i+1] = t;
  18.                         }
  19.         
  20.         for(i = 0; i<k; i++)
  21.                 printf("%d  ",a[i]);
  22.         
  23.         return 0;
  24. }
复制代码


另外,把所有变量在函数开头时进行声明并不是一个好习惯。这种写法只是从c89留下来的习惯而已。现在更推荐在使用变量前再声明变量。这样的程序更有可读性,在实现一个较长的函数时,你也不用在看到一个变量时翻N页去找这个变量的声明。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢,虽然不懂vla是什么,但确实像你说的那样,应该像定义并输入数组个个数然后再定义数组
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-13 12:35:46 | 显示全部楼层
暗pluto 发表于 2019-4-12 23:21
a[k]
然后scanf("%d",&k);
数组不能这样定义

谢谢,不过看不懂,其实只要先定义然后输入k就好了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢,简单的方法只要先定义k并输入然后定义数组就好了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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++不支持的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

Ok 谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-13 14:15:05 | 显示全部楼层
晴初back 发表于 2019-4-13 12:35
谢谢,不过看不懂,其实只要先定义然后输入k就好了

两种方法都可以
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-7 11:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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