容易忽略的基础问题

今天遇到一个很基础的问题,如果一个函数要传出一个结构体,用值形式的返回值传出,与用引用加赋值的形式传出,与用指针然后memcpy的形式拷贝传出,与用引用形式的返回值,与用指针形式的返回值传出,与用指针不memcpy的形式传出传出的区别。得出以下结论:

  1. 用值形式的返回值传出会在栈中留有一份结构体的拷贝。
  2. 用引用和赋值的形式传出和用指针然后memcpy的形式拷贝传出基本等价,但用指针和memcpy的形式的话,需要知道外界的缓冲区大小,而引用由于有类型,所以事先已经知道了外界缓冲区的大小,不会发生缓冲区溢出等问题。
  3. 用引用或指针形式的返回值传出会暴露对象内部的内容,破坏了封装性
  4. 所以设计接口的时候,对于基本类型,尽量通过返回值的形式传出,而对于结构体,尽量用引用的形式传出,对于OOP,除非有特殊需要,都要保证以值的形式传出。

又一个基础问题,即memset的使用,memset第二个参数为int型的,只能给字符型的数据赋值,也就0-255。所以不要期望通过memset给一个float型的数组幅值,否则将得不到期望的结果。而且就算是给一个int型幅值,也只能赋0-255之间的值。

对于程序调试,当逻辑上找不到错误时,很有可能是类型上出现了错误。比如一个这样的循环:

1
2
3
4
5
INT8 i=0;
for(i=0; i<256; i++)
{
printf("hello world");
}

这会导致什么呢?一个死循环!!!
c语言函数中所有的定义必须在函数开头!
在函数外部只能定义变量是不能运行代码的!