practice_c

一、字符串赋值 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,但此处已属于非法操作,操作了被释放的区域。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值