2 u013845780 u013845780 于 2014.12.16 19:21 提问

C 复制数组的一点小问题 复制后输出结果和源数组不一样
 #include <stdio.h>

int i=5;

void input_array ( int array[] ){
    int a;
    for ( a=0; a<i; a++ ){
    scanf ( "%i", &array[a] );
    }
}

void output_array ( int array[] ){
    int a;
    for ( a=0; a<i; a++ ){
    printf ( "%i%s", array[a], "\t" );
    }
}

void copy_array ( int source[], int output[] ){
    int a;
    for ( a=0; a<i; a++ ){
        output[i]=source[i];
    }
}

int main(){
    int array[i];
    int copy_form_array [i];
    printf ("%s%i%s", "Pleast enter some numbers ( ", i, " integers limited ): \n");
    input_array ( array );
    output_array ( array );
    printf ( "%s", "\n" );
    copy_array ( array, copy_form_array );
    output_array ( copy_form_array );
    printf ("%s", "\n");
    return 0;
}

在做一个复制数组的练习的时候写了这些代码
编译时没有提示
运行结果如下

 $ ./20141210_am_copy_array 
Pleast enter some numbers ( 5 integers limited ): 
1 2 3 4 5
1   2   3   4   5   
1594599648  32767   1617756790  32767   1594599680

为什么数组复制后跟源数组不一样??
初学者表示百思不得其解额 :(

4个回答

qqlindexi
qqlindexi   2014.12.16 19:44
已采纳
 void copy_array ( int source[], int output[] ){
    int a;
    for ( a=0; a<i; a++ ){
        output[i]=source[i];
    }
}

代换output[i]=source[i]; output[a]=source[a];

u013845780
u013845780 回复u011767611: 谢谢指点!
大约 3 年之前 回复
u011767611
u011767611 回复u013845780: 迭代数错用,导致你常识访问下标5的数组,造成内存非法访问。数组中真正需要你赋值的前5个元素,你没有赋值成功但你却试图打印出来,所以出现乱显的数字。。
大约 3 年之前 回复
u013845780
u013845780 确实没有注意到迭代数用错了,看来我的变量命名习惯不好,但是为什么会出现这个问题呢?其根源是什么?
大约 3 年之前 回复
caozhy
caozhy   Ds   Rxr 2014.12.16 19:52

晕这里你怎么写了i
for ( a=0; a<i; a++ ){
output[a]=source[a];
}

caozhy
caozhy 回复u013845780: 没事,解决了就好。
大约 3 年之前 回复
u013845780
u013845780 抱歉,采纳前没有刷新页面,而且也是 Landpack 先回答,所以……
大约 3 年之前 回复
caozhy
caozhy   Ds   Rxr 2014.12.16 19:39

scanf ( "%d", &array[a] );

u013845780
u013845780 尝试之后输出结果还是一样呢
大约 3 年之前 回复
u013845780
u013845780 %i 和 %d 都是代表整型吧,具体区别是什么?
大约 3 年之前 回复
u011767611
u011767611   2014.12.16 19:45

首先我必须说你写的代码太乱,你也太粗心啦!
看看我给你的代码!

#include <stdio.h>
static int i=5;
void input_array(int array[]){
    int a;
    for(a=0;a<i;++a){
        scanf("%d",&array[a]);
    }
    return ;
}
void output_array(int array[]){
    int a;
    for(a=0;a<i;++a){
        printf("%d\t",array[a]);
    }
    printf("\n---end--output---\n");
    return ;
}
void copy_array(int source[],int output[]){
    int a;
    for(a=0;a<i;++a){
        output[a]=source[a];
    }
}
int main(void)
{
    int array[i];
    int copy_from_array[i];
    printf("Please enter %d number\n",i);
    input_array(array);
    output_array(array);
    puts("----After copy----");
    copy_array(array,copy_from_array);
    output_array(copy_from_array);
    return 0;
}

希望对你有帮助!

u011767611
u011767611 回复u013845780: 编程习惯吧!你就当是买汽车,可以选择精简版的,也可以选择豪华版的!望采纳,谢谢
大约 3 年之前 回复
u013845780
u013845780 谢谢,以后我会多加注意格式结构的,不过 void 不加 return 也是可以的吧?
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!