单选题
1、第92题 (1.0分) 题号:542 若有int *p=( )malloc( 则向内存申请到内存
A
scanf(”%d”,p);
B
scanf(”%d”,&p);
C
scanf(”%d”,*p);
D
scanf(”%d”,**p);
答案解析
正确答案:A
解析:
这道题考查的是 C 语言中动态内存分配与 `scanf` 函数的参数传递规则。
### 1. 题目背景分析
虽然题目中的代码片段 `int *p=( )malloc(` 显示不完整,但根据语境可以推断其完整意图是:
```c
int *p = (int *)malloc(sizeof(int));
```
这行代码的作用是:
1. 调用 `malloc`函数在堆区申请一块大小为 `sizeof(int)` 的内存空间。
2. 将这块内存的首地址赋值给指针变量 `p`。
3. 此时,`p` 是一个指向 `int` 类型数据的指针,它存储的是一个**地址**。
### 2. `scanf` 函数原理
`scanf` 函数的原型为 `int scanf(const char *format, ...);`。
- 它需要接收变量的**地址**,以便将读取到的数据存入该地址对应的内存空间中。
- 格式字符串 `"%d"` 表示要读取一个十进制整数。
- 因此,第二个参数必须是一个指向 `int` 类型的指针(即 `int *` 类型)。
### 3. 选项逐一分析
* **A. `scanf("%d", p);`**
* `p` 的类型是 `int *`,它存储了 `malloc` 分配的内存地址。
* 直接将 `p` 传给 `scanf`,意味着告诉 `scanf`:“请把读到的整数存入 `p` 所指向的那块内存中”。
* 这是**正确**的用法。
* **B. `scanf("%d", &p);`**
* `p` 本身是一个指针变量,`&p` 取得的是指针变量 `p` 自身的地址。
* `&p` 的类型是 `int **`(指向指针的指针)。
* 如果这样写,`scanf` 会把读入的整数覆盖到指针变量 `p` 所在的内存位置,导致 `p` 不再指向原来申请的内存,而是变成了一个由用户输入决定的非法地址或随机值。这不仅逻辑错误,还可能导致后续程序崩溃。
* 这是**错误**的。
* **C. `scanf("%d", *p);`**
* `*p` 表示对指针 `p` 进行解引用,获取的是 `p` 指向的内存中的**值**(即一个 `int` 类型的数值)。
* `scanf` 需要的是地址,而不是值。传入一个整数值作为地址会导致程序试图向该数值对应的内存地址写入数据,这通常是非法操作,会导致段错误(Segmentation Fault)。
* 这是**错误**的。
* **D. `scanf("%d", **p);`**
* `p` 是 `int *` 类型,`*p` 是 `int` 类型。
* `**p` 试图对一个 `int` 类型的数据再次进行解引用,这在语法上就是错误的(编译器会报错,因为 `int` 不是指针)。
* 这是**错误**的。
### 4. 结论
要向 `malloc` 申请的内存中写入数据,应直接使用该内存块的地址,即指针变量 `p` 本身。
因此,正确答案是 **A**。
题目纠错
c语言选择判断题库
相关题目
单选题
1、第167题 (1.0分) 题号:510 int a=3,b=2,c=1; if( )a=b; else a=c; 则a的值为()。
单选题
1、第166题 (1.0分) 题号:652 在C语言中,引用数组元素时,其数组下标的数据类型允许是()。
单选题
1、第165题 (1.0分) 题号:176 数组名作为实参数传递给函数时,数组名被处理为()。
单选题
1、第164题 (1.0分) 题号:631 结构化程序设计所规定的三种基本控制结构是()。
单选题
1、第163题 (1.0分) 题号:712 若有说明:int n=2,*p=&n,*q=p;,则以下非法的赋值语句是()。
单选题
1、第162题 (1.0分) 题号:687 表达式,0x13&0x17的值是()。
单选题
1、第161题 (1.0分) 题号:113 执行下列语句后变量x和y的值是()。 y=10;x=y++;
单选题
1、第160题 (1.0分) 题号:634 以下不正确的定义语句是()。
单选题
1、第159题 (1.0分) 题号:642 在C语言中,一维数组的定义方式为:类型说明符数组名()。
单选题
1、第158题 (1.0分) 题号:181 C语言中函数调用的方式有()。
