C语言基本概念

1、段错误问题:

  用户程序访问的内存大小,超出了应用所提供的内存大小;

char a;
char* p =&a;
strcpy(p,"hello");
printf("string p %s\n",p);

上面声明的变量a只分配了一个字节大小的内存,但是用户想往一个字节大小的内存中拷贝5+1个字节大小的字符串;可以编译通过、但是运行报段错误;

  用户程序尝试访问系统保护的内存段大小;

char* s="hello";
printf("s: %s\n", s);
s[1] ='A';
printf("s: %s\n", s);

上面这个例子就是尝试访问系统保护的内存区域;尝试修改常量;

 

2、strlen()和sizeof()

  strlen()用于求出字符或者字符串的大小;原型如下,用于求出字符指针所指向内存里面数据的大小;

size_t strlen(const char *s);

  看看下面这个例子:

char a[10];
printf("strlen a[10] %d\n", strlen(a));

  数组a[10]中内容没有做初始化工作,a是字符类指针,保存一个地址;因此下面那句话是求出指针a基地址到a地址偏移10个字节中,这段内存中地址内容的大小;

所以输出结果不确定;

  strcpy()

拷贝的内容大于内存大小,编译有溢出警告,但是可以正常运行

char s[10];    
strcpy(s,"0123456789");

  定义了大小为10的字符数组,但是拷贝了大小有11的字符串;可以正常运行,可以正常输出;但是编译有警告;

3、结构体大小问题

  有两段代码如下

struct stu{
   char s;
   short num;
   int id;  
};

struct tea{
   char s;
   int id;
   short num; 
};

  在32位下,int类型的大小为4byte,short类型2byte,char类型为1byte;第一段代码由于char和short对齐后,扩展为4byte,因此整个结构体大小为8byte;

第二个结构体中,char类型被扩展为4byte,int为4byte,short被扩展为4byte,因此总大小12byte;

 

posted @ 2021-06-24 17:11  笑不出花的旦旦  阅读(241)  评论(0)    收藏  举报