简单C问题汇总

1 我一直以为运行后才会生成.exe,才知道编译成功就生成了,坑爹啊。。。。

2 把文件拖拽到cmd里,cmd会自动把文件的完整路径写在命令行上
3 头文件和源文件不必一一对应,如函数在1.h里声明,在2.c里实现,在3里包含1.h仍可以通过
程序如下:
char aa=0;
int bb=1;
int cc=0x0f0f0f0f;
int dd=0x01040508;
则他们的地址如下:
+ &aa 0x0012ff7c ""
+ &bb 0x0012ff78
+ &cc 0x0012ff74
+ &dd 0x0012ff70
正好相反。
5 void* 也可以代替FILE*作为fopen的返回值
6 又犯了个很二的事,在main外对结构体的成员变量进行了赋值(普通变量可以这么赋值),赋值处也不属于任何的函数,于是出来一堆错,我还以为是结构体定义错,折腾了好一会。但同时也发现了一件好事,就是typedef struct xxx{}xxx,完了就可以像使用类一样定义结构体的实例,不用写stuct了。
 
下面一段是关于这个问题在百毒的回答:
关于“为什么整型的就可以,结构体类型的就不能这么赋值呢?”——整形等常规数据类型由编译器自动识别,而自定义的数据类型(楼主自定义的结构体类型),编译器在编译阶段无法识别,故出错。
 
关于“在函数外单个初始化”——在入口函数(main函数)之前定义变量及初始化,得到的是全局变量。编译器对程序进行编译时,必须先构造或者创建全局变量,为全局变量分配内存,再找入口函数;而在创建全局变量时,该变量类型(楼主自定义的结构体)编译器无法识别,故无法创建该全局变量。
 
进入main函数之后,数据类型(楼主自定义的结构体)被定义,因此再进行变量定义及初始化,肯定就不会出错。
7 在main里申明的变量是不能为其函数识别的,但在main外申明的变量则可被main以及任何函数识别,若在main的开始就为变量分配空间和初始化,其结果是能被函数认知的。
8 calloc是一个很花时间的函数(30ms左右),malloc好一些,也占比较多,最好都不要在循环中使用(比如RTP发送的循环)
9 opencv的8位3通道不是256色,好像指的就是24位图,而opencv本身并没有24位图的格式。。。坑我啊!
10 事实上,bin文件夹和dll相关,在目录executable里若添加了bin文夹,里面的dll将在需要被调用时自动调用。
11 setmode的使用
_setmode(fileno(stdin),O_BINARY); //以二进制方式读取
fread(buf,len,1,stdin);//这里就可以从stdin以二进制方式读取了
12 for循环的内部
for(i =0;i<10;i++)
{
int abc=0;
abc++;
printf("%d",abc);
}
这段代码的显示结果将一直是11111111。
如果改为int abc则显示结果将一直是随机的一个初值如-858993459  -858993458  -858993457
如果改为staitc abc=0,则是1234.。。
如果改为static abc,则是1234....(静态变量初始化为0) 
以上,C和CPP都可运行且任意一种情况编译器都不会报重复定义 ,反汇编后发现定义一个变量(不赋值),是不会有汇编代码的。 
 
13 ctrol+f5显示vs的输出结果
 
14 vs2008中若加入中文注释,出现源文件与模块生成时的文件不同,仍要让调试器使用它吗,或直接显示没有源文件是否要显示反汇编。把中文注释去掉即可。
 
15 opencv的库,若在debug模式下用release的库,虽然能编译成功,但实际上程序运行起来却有问题。

 

posted @ 2013-02-24 13:14  yurius  阅读(348)  评论(0编辑  收藏  举报