11.char szstr[10];
strcpy(szstr,"0123456789");
产生什么结果?为什么?
SZSTR的前10个字符被填充为字符串
"0123456789"
的字符,但是数组没有留出空间来存储字符串的终止符\0
。在C语言中,字符串总是以空字符(\0
)结尾,以便函数如strcpy()
, strlen()
, printf()
等能够正确地识别字符串的结束位置
【标准答案】长度不一样,出现段错误。
12、数组和链表的区别?
【标准答案】数组:数据顺序存储,固定大小;
链表:数据可以随机存储,大小可动态改变
13、 void main()
{
char aa[10];
printf(“%d”,strlen(aa));
}
会出现什么问题?打印结果是是多少?
这道题首先应该把void改成int
其次,数组aa没有被初始化,没有空字符\0,这里的strlen是返回长度
【标准答案】sizeof()和初不初始化,没有关系,
strlen()和初始化有关,打印结果值未知。
14、给定结构struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
};问sizeof(A)
char t:4; // 4位位域,通常占用1字节,但只使用4位
char k:4; // 4位位域,同样占用1字节,但只使用4位
unsigned short i:8; // 8位位域,通常占用2字节,但只使用8位
unsigned long m; // 通常占用4字节,具体取决于平台和编译器
char k:4; // 4位位域,同样占用1字节,但只使用4位
unsigned short i:8; // 8位位域,通常占用2字节,但只使用8位
unsigned long m; // 通常占用4字节,具体取决于平台和编译器
1+1+2+4=8
【标准答案】8
/
15、 struct name1{
char str;
short x;
int num;
};求sizeof(name1)?
char str; // char 类型通常占用 1 字节
short x; // short 类型通常占用 2 字节
int num; // int 类型通常占用 4 字节
short x; // short 类型通常占用 2 字节
int num; // int 类型通常占用 4 字节
这里考虑了对齐规则,给出8
在这个例子中,
str
占用1字节,不需要对齐。
x
是
short
类型,可能需要对齐到2字节边界,但由于
str
已经占用了1字节,
x
可以直接放在
str
后面,不需要额外的填充。
num
是
int
类型,通常需要对齐到4字节边界。因此,在
x
和
num
之间可能需要填充1字节,以确保
num
的起始地址是4字节的倍数
【标准答案】8
16、 struct name2{
char str;
int num;
short x;
};求sizeof(name2)?
1+4+2 = 7
【标准答案】12
考虑填充字节的不会,希望大佬指导一下
17、程序哪里有错误
wap( int* p1,int* p2 )
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
未初始化P的内存位置
【标准答案】p为野指针
19、 (void *)ptr 和 (*(void**))ptr的结果是否相同?其
中ptr为同一个指针。
-
(void *)ptr
:这是一个类型转换,将ptr
转换为一个void *
类型的指针。void *
是一个通用指针类型,可以指向任何数据类型。这种转换不会改变ptr
所指向的内存地址,只是改变了指针的类型。 -
(*(void**))ptr
:这是一个指针的解引用和类型转换的组合。首先,ptr
被解引用为一个void **
类型的指针(即指向指针的指针),然后这个解引用得到的指针又被转换为一个void *
类型的指针。如果ptr
实际上是一个指向void *
类型指针的指针,那么这种解引用和类型转换的组合会得到与(void *)ptr
相同的结果。
【标准答案】(void *)ptr 和 (*(void**))ptr值是相同的
20、要对绝对地址0x100000赋值,我们可以用
(unsigned int*)0x100000 = 1234;
那么要是想让程序跳转到绝对地址是0x100000去执行
,应该怎么做?
【标准答案】*((void (*)( ))0x100000 ) ( );
首先要将0x100000强制转换成函数指针,即:
(void (*)())0x100000
然后再调用它:
*((void (*)())0x100000)()