一、字符串赋值 char str[80]; str="abcdefg"是否正确?
错误,
1、数组不能整体赋值,只能整体初始化
2、数组名在第二句为数组首元素的空间
二、计算机工作时,内存储器用来存储?
程序和数据
程序是用来控制计算机完成某项任务的指令的集合,而数据是程序运行处理的对象。
三、字符串数组
#include <stdio.h>
void fun( char ** p)
{
int i;
for(i=0;i<4;i + + )printf("% s",p[i]);
}
main( )
{
char *s[6]={ "ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX" };
fun(s);
printf("\n");
}
输出:ABCDEFGHIJKLMNOP
图解
四、数组与字符串
char x[] = "abcdef";
char Y[] = {'a','b','c','d','e','f'};
数组X和数组Y的长度比较?数组X的长度大于数组Y的长度
解析:首先,是数组的长度,并不是字符串的长度(审题)
其次,数组X等价于{'a','b','c','d','e','f','\0'};
五、'0'与0
void assign()
{
char arr[20];
for(int i = 0; i < 5; i++){
arr[i] = '0';
}
printf("%d\n", strlen(arr));
}
输出结果:不确定
解析:'0'(字符)不等于0(数字),0:'\0':NULL
六、结构体对齐与宏替换
#define MAX A+B
struct tmp{
unsigned char a : 4;
unsigned char b : 2;
unsigned char c;
unsigned char d : 1;
}
struct tmp *p = (struct tmp*)malloc(sizeof(struct tmp)*MAX);
当A=2, B=3时,p分配9个字节的空间
解析:首先,(以4个字节对齐)结构体tmp的大小为:3个字节
(最大对齐数是所有成员对齐数中最大的)(对齐数是编译器默认对齐数和自身类型大小的较小值)
(即,如上题的结构体,按4个字节的对齐方式 与 按个字节的对齐方式,它的大小都是3个字节)
其次,宏替换MAX,得:3*2+3 = 9
七、强转与扩展
char c;
unsigned char uc;
unsigned short us;
c = 128;
uc = 128;
us = c + uc;
printf("%#x\n", us);
us = (unsigned char)c + uc;
printf("%#x\n", us);
us = c + (char)uc;
printf("%#x\n", us);
输出结果:0x0 0x100 0xff00
解析:us = u+uc:
us = (unsigned char)c + uc:
us = c + (char)uc:
八、改错
#include<stdio.h>
#include<string.h>
#include<Windows.h>
#pragma warning(disable:4996)
#define LEN 32
struct A{
char arr[LEN];
int i;
};
struct B{
char *p;
int j;
};
void fun(struct A a, struct B *bp)
{
bp->p = a.arr;
}
int main()
{
struct A a = { 0 };
struct B b;
strcpy(a.arr, "12345");
fun(a, &b);
printf("%s\n", b.p);
system("pause");
return 0;
}
错误:在fun函数中,用bp指针(指向结构体b的指针)接收,而此时,并没有给结构体变量b的p成员赋值,而是操作了一个临时变量结构体指针,而函数调用完,函数栈帧被释放,该函数栈帧就失效。而理论上说printf函数也是函数,会将fun函数已被释放的栈帧覆盖,程序的输出结果也就是随机值;
但此处考虑到了printf函数与fun函数栈帧的大小问题,经过在vs2013测试,可以输出12345,但此处已属于非法操作,操作了被释放的区域。