我一直试图创建一个子程序,将一个给定的元素(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,但事实并非如此。我认为阵列的大小增加但最后一个元素没有达到我预期的价值......任何建议?
答案 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