鱼C论坛

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

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

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

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

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

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

int main()
{
        int k,a[k], t, i, j;
        scanf("%d",&k);
        
        for(i = 0; i < k; i++)
                scanf("%d",&a[i]);
        putchar('\n');
        for(j = 0; j < k-1; j++)
                for(i = 0; i < k-1-j; i++)
                        if(a[i] > a[i+1])
                        {
                                t = a[i];
                                a[i] = a[i+1];
                                a[i+1] = t;
                        }
        
        for(i = 0; i<k; i++)
                printf("%d  ",a[i]);
        
        return 0;
}
最佳答案
2019-4-13 00:02:49
本帖最后由 Croper 于 2019-4-13 00:30 编辑

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

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

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

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

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

使用道具 举报

发表于 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[i])     ;
                for(j = 0 ; j < k - 1 ; j ++) {
                        for(i = 0 ; i < k - 1 - j ; i ++) {
                                if(a[i] > a[i + 1]) {
                                        t = a[i]                   ;
                                        a[i] = a[i + 1]            ;
                                        a[i + 1] = t               ;
                                }
                        }
                }
                printf("\n")                                       ;
                for(i = 0 ; i < k ; i ++) printf("%d  " , a[i])    ;
                printf("\n")                                       ;
                free(a)                                            ;  // 善始善终
        } else {
                fprintf(stderr , "error : failure of malloc()!\n") ;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

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

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

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

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

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

使用道具 举报

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

谢谢,虽然不懂vla是什么,但确实像你说的那样,应该像定义并输入数组个个数然后再定义数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢,不过看不懂,其实只要先定义然后输入k就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢,简单的方法只要先定义k并输入然后定义数组就好了
想知道小甲鱼最近在做啥?请访问 -> 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++不支持的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

Ok 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

两种方法都可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 14:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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