使用C中的子程序追加数组

时间:2016-11-11 22:44:32

标签: c arrays

我一直试图创建一个子程序,将一个给定的元素(x)添加到数组的末尾。这是我到目前为止所做的:

typedef int TAB[50];
TAB t;
int N;

int append(int x){
    N++;
    t[N - 1] = x;
    return 0;
}

int main(){
    int i;
    N = 5;
    TAB t = {1,2,6,8,9};
    append(5);
    for (i = 0; i < N; i++){
        printf("%d ", t[i]);
    }
    return 0;
}

正如您在函数append中看到的那样,我增加了数组的长度,然后将整数5作为最后一个元素。但是,当我运行程序时,这是我得到的结果:

1 2 6 8 9 0

我希望0为5,但事实并非如此。我认为阵列的大小增加但最后一个元素没有达到我预期的价值......任何建议?

3 个答案:

答案 0 :(得分:2)

您有两个名为t的变量。 append函数只知道“全局”变量(来自第2行),而for中的main循环只知道“本地”变量(来自第14行)。 / p>

答案 1 :(得分:2)

在您的源代码中,您已声明两次TAB t。第一个是全局的,可以从append()函数看到,但隐藏在main()函数=&gt;内的第二个声明中。 TAB t = {1,2,6,8,9};

如果您使用本地初始化表单TAB t;替换全局声明TAB t = {1,2,6,8,9};,则append()main()都会显示您的数组。

答案 2 :(得分:0)

在函数名中t是在函数声明之前在全局命名空间中的声明中声明的名称

TAB t;
^^^^^
int N;

int append(int x){
    N++;
    t[N - 1] = x;
    ^^
    return 0;
}

因此该函数会更改全局数组。在main

中声明的数组
int main(){
    int i;
    N = 5;
    TAB t = {1,2,6,8,9};
    ^^^^^^^^^^^^^^^^^

在功能中不可见。

错误的原因是函数引用全局变量,因此它具有所谓的副作用。

尽量不要在函数定义中使用全局变量。

此外,您在添加新值后忘记增加N.

程序可以按以下方式查看

#include <stdio.h>

#define N   50

typedef int TAB[N];

size_t append( int *a, size_t n, int value )
{
    a[n++] = value;

    return n;
}

int main( void )
{
    TAB t = { 1, 2, 6, 8, 9 };
    size_t n = 5;

    n = append( t, n, 5 );

    for ( size_t i = 0; i < n; i++ ) printf( "%d ", t[i] );
    printf( "\n" );

    return 0;
} 

程序输出

1 2 6 8 9 5