首页 > 试题广场 >

有以下程序,程序的输出结果是?

[单选题]

有以下程序

#include <stdio.h>
#include <stdlib.h>
void fun(int *p1, int *p2, int *s) {
    s = (int *)malloc(sizeof(int));
    *s = *p1 + *(p2++);
}
int main() {
    int a[2] = {1, 2}, b[2] = {10, 20}, *s = a;
    fun(a, b, s);
    printf("%d \n", *s);
}


程序运行后的输出结果是?

  • 42
  • 41
  • 1
  • 0
q最开始是指向a的,s分配内存的操作重新修改了s的指向,,并没有修改q的指向,因为p1,p2,s只是三个复制品,进行*s=9这样的操作可以改变q的值,但是一旦s本身指向改变了就不能再修改q了
发表于 2015-10-07 09:27:01 回复(3)
更多回答
  这道题我觉得关键在于s指针所在物理内存改变。fun ( int *pl,int *p2,int *s )中,
本来s和p是指向同一个物理地址的,实参q和形参s共用一段内存空间,如果没有s重新申请新的内存的话,
对s的操作就是对p的操作。由于s所在物理地址改变,因此s和p两个不相关,因此*p还是1.
    如果fun ( int *pl,int *p2,int *s )
             {  *s=*pl + *p2; }
这样的话 *p就是41.

发表于 2016-09-03 22:49:23 回复(5)
*s是形参,q是实参,当调用函数时,s和q关系为int *s=q;将q中所存储的地址复制给s,接下来s=(int*) calloc(1,sizeof(int))改变了s指向的对象,此时s和q已经无关了,因此后边的操作不会影响到q了。
发表于 2017-03-02 11:14:55 回复(0)
数组名作为指针传递是按值传递的,不是引用传递
发表于 2016-06-02 18:47:50 回复(0)
由实验不难看出,s指向的空间地址为a的地址,p1也是,t在未分配空间前也是;但是再t被分配完空间后,t所指向的地址就发生了变化,此时它的内部无有效数据。而p2和b的地址相同,在执行完p2++后,p2指向了b[1]的空间,显然t所指的空间最后结果应该为21,而s所指空间内的值自始至终未发生变化一直为1
发表于 2021-10-31 20:34:59 回复(1)
1、数组名作为参数传递时会转化为指针。
2、s本来是和q一样指向同一片地址,但是又给它重新分配了一块地址,所有修改*s就和*q没关系了
编辑于 2018-01-07 22:20:29 回复(0)
改变指针指向的内容,需要指针的地址,否则改变的还是副本!
发表于 2017-04-05 20:16:36 回复(0)
我怎么看不懂评论区呢, 哪来的q啊
发表于 2022-02-21 12:43:13 回复(2)
   

发表于 2017-08-09 16:54:13 回复(0)
发表于 2022-11-29 12:44:08 回复(0)
本题考查把数组名作为函数参数,执行fun函数后,s的值并没有发生变化,仍然是指向a,所以输出结果为1,选项C正确。
编辑于 2021-08-19 18:19:40 回复(7)
指针s是形参,改变s并没有改变实参
发表于 2016-08-02 09:21:25 回复(0)
指针的指针才能修改地址
发表于 2021-02-15 11:23:20 回复(0)
形参s未分配内存空间(malloc)前,与实参共用一块地址(即改形参值,实参值也跟着变),但是形参s分配空间后,二者不再关联。
发表于 2018-04-04 14:18:58 回复(0)
开始时q指向数组a的第一个元素,a[0];函数参数传递都是通过值传递的,在进入函数fun时,q只是拷贝自己的一份内容给它,函数调用结束后q的内容还是不变,指向数组a第一个元素;且在函数中没有通过指针改变数组的值,所以打印值为a[0]
发表于 2017-04-07 19:51:51 回复(0)
答案不应该是11吗?
发表于 2021-11-12 08:10:35 回复(0)
这里的malloc应该是calloc
发表于 2021-06-14 13:52:11 回复(0)
感觉把int (*s)看成int (x)可能好理解点
发表于 2016-08-31 23:22:26 回复(0)
指针传递时候,如果形参里面碰到malloc这些,不好意思,主函数传递的地址会被重新修改。简单理解,有了malloc这些,形参和实参没有关系了。
发表于 2021-01-13 08:42:53 回复(0)
malloc新的内存,然后释放掉。相当于函数的局部变量。返回值。。。。。
发表于 2020-10-19 16:03:29 回复(0)