C语言—每日选择题—Day39

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: C语言—每日选择题—Day39

第一题

1. 有下面的定义,则指针s指向的字符串所占的空间大小为多少?

char *s = "\ta\017bc";

A:9

B:5

C:6

D:7

答案及解析 C

本题涉及到了转义字符

\t 是水平制表符,算一个字节

\017 是表示八进制数,算一个字节;

末尾有个隐藏的 \0 ,算一个字节

所以1 + 1 + 1 + 2 + 1 = 6字节;

第二题

2. 下面是对s的初始化,其中不正确的是(    )


A:char s[5]={"abc"};

B:char s[5]={'a','b','c'};

C:char s[5]=" ";

D:char s[5]="abcdef";

答案及解析 D

ABC正确

A会被转换为 char s[5] = {'a', 'b', 'c', '\0', '\0'};

B同A转换的一样

C也是,第一个是空格,后面都是 \0

D:错误,明显的越界。

第三题

3. 对于下面代码段,下面的语句中正确的是?

const char * const name = " Chen ";

A:name[3]='a';

B:name="lin";

C:name=(char*)malloc(sizeof(char));

D:printf("%c\n", name[3]);

答案及解析 D

首先要明确const在* 的前后修饰的意义是不同的

const在*前,修饰的是指针指向的对象不可被修改

而const在*后面则修饰的指本身不可以被修改

所以本题const都有,表示指针不可以被修改的同时指针指向的内容也不可以被修改;


ABC都是错误的,A是修改内容,BC都是修改指针的指向,C是让指针指向新开辟的空间;

D正确,是输出,没有对指针本身或者指向的内容做出改变;

第四题(好题)

4. 运行下面程序的输出结果是()

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void MallocMem(char* pc) 
{
    pc = (char*) malloc (100);
    return;
}
int main() 
{
    char *str=NULL;
    MallocMem(str);
    strcpy(str,"hello ");
    strcat(str, "world");
    printf("%s",str);
    return 0;
}

A:hello world

B:程序编译错误

C:程序运行时崩溃

D:其他几项都不对

答案及解析 C

首先我们来分析一下这个程序,先定义了一个字符指针str,初始化为空指针,然后作为一个参数传入了MallocMem这个函数,进入这个函数之后开辟了一段空间;

但是我们需要注意的是什么?这里传入的实参,是str本身,然而形参是实参的一份临时拷贝,对形参的改变不会影响我们的实参,所以虽然开辟了空间,让pc指针指向了这段空间,但是对str没有任何改变,而在MallocMem函数结束的时候,形参pc就销毁了,虽然空间还在,因为是从堆上申请的空间,不会因为函数的结束而销毁,只会在整个程序结束自动销毁;


这里插个题外话,我们在使用malloc 的时候,一定要主动去释放空间,养成好习惯;


所以我们重点要知道str依旧是个空指针,对空指针进行strcpy的操作,不会在编译这里报错,因为编译只是检查语法的错误,一定是在运行的时候出现错误,对空指针的解引用会报错,因为没有给str分配内存,所以程序会崩溃;所以如果我们要想让str指向新开辟的空间,需要传str的地址,C++可以传引用来解决。

第五题

5. 下面的语句是否正确?

char str[80]; 
str="abcdefg"

A:正确

B:错误

答案及解析 B

首先数组名是一个指针常量,类型是const 类型,数组名不可以被修改;

其次为什么可以char str[50] = "abcdefg";因为这是开辟数组空间的同时,给每个字符数组的元素都初始化了,建立在栈区的;

而题中的是我开辟了空间,但是没有初始化;而数组名是属于指针常量,char * const类型的,不可以被修改;


相关文章
|
6月前
|
C语言
C语言—每日选择题—Day60
C语言—每日选择题—Day60
|
6月前
|
编译器 C语言
C语言—每日选择题—Day61
C语言—每日选择题—Day61
|
6月前
|
编译器 C语言
C语言—每日选择题—Day57
C语言—每日选择题—Day57
|
6月前
|
C语言
C语言—每日选择题—Day56
C语言—每日选择题—Day56
|
6月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
52 2
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
|
6月前
|
算法 C语言 C++
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)(中)
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)
154 1
|
6月前
|
算法 编译器 C语言
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(上)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
44 3
|
6月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(中)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
42 1
|
6月前
|
存储 编译器 C语言
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题(下)
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题
45 0
|
6月前
|
Java 编译器 定位技术
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题(中)
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题
45 0