有以下程序 #include <stdio.h> void fun(int *s) { static int j = 0; do { s[j] += s[j + 1]; } while (++j < 2); } int main() { int i, a[10] = {1, 2, 3, 4, 5}; for (i = 1; i < 3; i++) fun(a); for (i = 1; i < 5; i++) printf("%d", a[i]); printf("\n"); return 0; } 程序运行后的输出结果是? 5745为什么结果是这个
时间: 2024-03-29 12:41:39 浏览: 20
程序运行后的输出结果应该是 5745。
函数 fun 中定义了静态变量 j,每次执行 fun 函数时,j 的值会保留上一次的值。在 main 函数中,循环两次调用 fun 函数,每次执行 fun 函数时,都会将数组 a 中相邻的两个元素相加,也就是将 a[0] 和 a[1] 相加,以及将 a[1] 和 a[2] 相加。由于 j 是静态变量,第一次执行 fun 函数时,j 的值为 2,第二次执行 fun 函数时,j 的值为 4,所以实际上对于数组 a,执行了以下操作:
a[0] = a[0] + a[1] = 1 + 2 = 3
a[1] = a[1] + a[2] = 2 + 3 = 5
a[2] = a[2] + a[3] = 3 + 4 = 7
a[3] = a[3] + a[4] = 4 + 5 = 9
a[4] = a[4] + 0 = 5 + 0 = 5
最后循环输出 a 数组中下标从 1 到 4 的元素,即 3、5、7、9,结果为 5745。
相关问题
#include <stdio.h> void fun(int *p) { static int arr[100]; p=arr; } int main(int argc,const char* argv[]) { int*p=NULL; fun(p); for(int i=0;i<100;i++) { p[i]=i+1; printf("%d ",p[i]); } }
这段代码存在一个问题。在函数 `fun` 中,参数 `p` 被赋值为 `arr` 数组的地址,但是这个赋值操作只在函数内部起作用,不会对 `main` 函数中的 `p` 产生影响。
在 `main` 函数中,`p` 被初始化为 `NULL`,然后传递给 `fun` 函数。但是在 `fun` 函数内部,对 `p` 的赋值操作只会修改函数内部的局部变量 `p`,而不会影响到 `main` 函数中的 `p`。
在 `main` 函数中,对 `p` 进行循环赋值和打印操作会导致未定义行为,因为 `p` 是一个空指针,没有分配任何内存空间。修改代码的正确方式是将 `p` 声明为一个指向整数数组的指针,并在 `main` 函数中分配内存给它。以下是修正后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
void fun(int *p)
{
static int arr[100];
p = arr;
}
int main(int argc, const char* argv[])
{
int *p = NULL;
p = malloc(100 * sizeof(int)); // 分配内存给 p
fun(p);
for (int i = 0; i < 100; i++)
{
p[i] = i + 1;
printf("%d ", p[i]);
}
free(p); // 释放内存
return 0;
}
```
修正后的代码中,我们在 `main` 函数中使用 `malloc` 函数为 `p` 动态分配了一个整数数组的内存空间。然后将 `p` 传递给 `fun` 函数,在 `fun` 函数内部的赋值操作将修改 `p` 指向的内存空间。最后在 `main` 函数中进行赋值和打印操作。记得在程序结束前调用 `free` 函数释放动态分配的内存。
用二级指针来修改这段代码#include <stdio.h> void fun(int *p) { static int arr[100]; p=arr; } int main(int argc,const char* argv[]) { int*p=NULL; fun(p); for(int i=0;i<100;i++) { p[i]=i+1; printf("%d ",p[i]); } }
这段代码存在一个问题。在函数 `fun` 中,参数 `p` 是一个指向整数的指针。在函数内部,将 `arr` 数组的地址赋值给 `p`,但是这个赋值操作只在函数内部起作用,不会对 `main` 函数中的 `p` 产生影响。
在 `main` 函数中,`p` 被初始化为 `NULL`,然后传递给 `fun` 函数。但是在 `fun` 函数内部,对 `p` 的赋值操作只会修改函数内部的局部变量 `p`,而不会影响到 `main` 函数中的 `p`。
此外,在 `main` 函数中对空指针 `p` 进行循环赋值和打印操作是不安全的,并且会导致未定义行为。
如果您希望通过函数修改 `main` 函数中的指针 `p`,可以使用二级指针。以下是修正后的代码:
```c
#include <stdio.h>
void fun(int** p)
{
static int arr[100];
*p = arr;
}
int main(int argc, const char* argv[])
{
int* p = NULL;
fun(&p);
for (int i = 0; i < 100; i++)
{
p[i] = i + 1;
printf("%d ", p[i]);
}
return 0;
}
```
修正后的代码中,我们将参数 `p` 声明为二级指针(指向指针的指针)。在 `fun` 函数中,通过修改二级指针 `*p` 的值,将 `arr` 数组的地址赋给 `p` 指向的指针。这样就能够在 `main` 函数中修改 `p` 指向的内存。
在 `main` 函数中,我们将 `p` 的地址传递给 `fun` 函数,使得 `fun` 函数能够修改 `main` 函数中的指针 `p`。然后,在循环中对 `p` 进行赋值和打印操作。修正后的代码能够正确输出结果。