Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 新手求助啊！！！！我也不知道是啥子问题了。。反正就是出错了。

回复:
user: user-1
content: 指针越界了哦

user: user-2
content: 引用 7 楼 zxh707wk 的回复:突然发现自己已经3个月没写代码了。。。 失去之后才会觉得珍贵。

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

user: user-3
content: 引用 8 楼 u013344915 的回复:自己写了一份 http://blog.csdn.net/a_flying_bird/article/details/38690025该页面8.20有更新

user: user-3
content: 自己写了一份 http://blog.csdn.net/a_flying_bird/article/details/38690025

user: user-4
content: 突然发现自己已经3个月没写代码了。。。

user: user-3
content: 一些教科书可能会喜欢拿scanf之类的来教学，其实真正做项目之后，会发现几乎好几年都不会用scanf。也正因为学校教科书中的scanf方式，往往无法理解模块化的思想。

user: user-5
content: # include <stdio.h> # include <stdlib.h> int n;  struct Student { 	int age; 	char sex; 	int score; 	char name[20]; };  void Inputstudent(struct Student * p) { 	int i; 	for (i = 0; i < n; i++) 	{ 		printf("\nPlease enter the name\nThe name is "); 		scanf("%s", p[i].name); //not need '&'  		printf("\nAnd then tell me that %s is a boy or a girl\n", p[i].name); 		printf("Enter B if a boy,and G if a girl\n"); 		char * q = (char*)malloc(sizeof(char));          	if(p == NULL) 		          exit(1);    		*q = '0'; 		scanf(" %c", q);  //add a space before %c , 						//make sure to skip something like '\n' '\t'			 		printf("So how old is ");	 		if (*q == 'b' ||*q == 'B')//here 		{ 			p[i].sex = 'B'; 			printf("he?\nHe is "); 		} 		else if (*q == 'g' || *q == 'G')//here 		{ 			p[i].sex = 'G'; 			printf("she?\nShe is "); 		} 		else 			printf("Can you iust do what I told you?!\nThis student is neither a boy nor a girl.\n");	  		scanf("%d", &p[i].age);  		printf("\nAt last,what is the socre?\nThe score is "); 		scanf("%d", &p[i].score);//here need '&'  	}  }  void Outputstudent(struct Student * p) { 	printf("Name     Sex     Age     score    \n"); 	for (int i = 0; i < n; i++) 		printf("%s\t%c\t%d\t%d\t\n", p[i].name, p[i].sex, p[i].age, p[i].score);	 }  int main(void) { 	printf("How many students are there totally?\nThe namber is "); 	scanf("%d", &n); 	struct Student * p = (struct Student *)malloc(n * sizeof(struct Student));//need to check  whether p == NULL or not; 	if(p == NULL) 		exit(1); 	Inputstudent(p); 	Outputstudent(p);  	return 0; }

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-6
content: scanf("%s", &p[i].name); 这里多了一个&符号。  malloc后都判断一下其返回值是否为NULL的说。

user: user-0
content: 谢谢！我在去查查看。

user: user-7
content: 这是非法访问，你出错的地方是在： Inputstudent函数的最后一句： scanf("%d", p[i].score); 此处丢了一个&符号。 你程序里还有其他的问题，自己再检查下。
user-0 提问: cout／printrf的内容是放在 文字常量区吗

回复:
user: user-1
content: 嵌入系统很有可能没有所谓的文字常量区。 所以，楼主，你还是说说你的原始问题吧。

user: user-0
content: 回复7楼 54454 编译器是gcc 他们的有区别。我用vs模拟了一下汇编，  char mm[10] ={'h', 'e', 'l', 'l', 'o', 0}， 直接赋值给mm char mm[10] = "hello".                      先存”hello“， 然后从”hello“的地址取出来再赋值给mm  回复6楼 ParsifalC 是嵌入式系统  问题基本解决了。 没有单独的文字常量区，不能直接访问地址。   但是系统提供某些间接访问的方法，可以读取到常量的地址。  谢谢大家。

user: user-0
content: 需要纠正一下，四楼说的不对。 printf("%s", "hello")   这个不能打印出来

user: user-2
content: 看了一下原帖，照理来说应该是没分别的。字符串“abcd”，最后编译器会帮你加上一个'\0'。至于这些内容放在哪，那块内存的属性是只读或者别的，你没指定的话就都是由编译器默认决定的。问一下用的什么编译器？

user: user-3
content: char mm[10] = "hello"; "hello"是常量区的，赋值时编译器的操作是将常量区的6个字符拷贝到栈区。 你这样的报错，可能是跟环境有关。 貌似嵌入式系统的有可能不存在常量区，不是很确定。 你这个是什么环境下做的？

user: user-4
content: 引用 8 楼 registercsdn 的回复:需要纠正一下，四楼说的不对。 printf("%s", "hello")   这个不能打印出来 #include <stdio.h> #include <windows.h> int main() {     int i;      for (i=0;i<5;i++) {         printf("%s","hello");         fflush(stdout);         Sleep(500);     }      return 0; }

user: user-0
content: 这样就会报错 char mm[10] = "hello".    找不到地址  这样就是对的 char mm[10] ={'h', 'e', 'l', 'l', 'o', 0}

user: user-0
content: 回复二楼taodm  使用 printf("%s", "hello")   这个没有问题，可以打印出来。

user: user-0
content: 这是原始问题。 http://bbs.csdn.net/topics/390864598?page=1#post-398011460

user: user-5
content: 是，包括"%s"也是，都在文字常量区 这和cout/printf没关系。代码里面任何地方的"fdsarewfdsa"，都是在文字常量区
user-0 提问: linux scanf问题

回复:
user: user-0
content: 引用 12 楼 sinat_19761531 的回复:在每一行的scanf下面再加上一个scanf("%*c")意思是晴空输入流缓冲区里面的一个字符，这里清空的是‘\n’不然即使你的scanf里面变量都加了&，结果你第二个显示永远是个换行符

user: user-1
content: scanf函数用错了！再看看

user: user-2
content: 引用 4 楼 lin5161678 的回复:[quote=引用 1 楼 xinsuixiaofeiyu 的回复:] fflush可移植性不好！在VC下都能成功但在gcc下不一定成功，标准不一样，有兴趣可以看看这篇文章 不是标准不一样 标准是一样  标准保证 fflush(stdin)这样的情况结果不做任何保证  所以可以是 清空 可以没清空 [/quote]貌似是的，对这种情况是未定义的。还有个疑问，为什么在VC下一般都能成功呢？

user: user-3
content: man  scanf

user: user-4
content: scanf("%c",ch);---->scanf("%c",&ch); scanf("%c",nch);---->scanf("%c",&nch);

user: user-5
content: 引用 1 楼 xinsuixiaofeiyu 的回复:fflush可移植性不好！在VC下都能成功但在gcc下不一定成功，标准不一样，有兴趣可以看看这篇文章 不是标准不一样 标准是一样  标准保证 fflush(stdin)这样的情况结果不做任何保证  所以可以是 清空 可以没清空

user: user-5
content: fflush(stdin);用法错了

user: user-6
content: 引用 楼主 u012422205 的回复:#include <stdio.h> int main() {  	char ch,nch;  	fflush(stdin); 	scanf("%c",ch); 	printf("ch = %c\n",ch);  	fflush(stdin); 	scanf("%c",nch); 	printf("nch = %c\n",nch);  	return 0; } 运行结果是 ch = nch = 为什么??????? 检查一下输出本地环境的设置，如果是unicode环境变成ANSI环境的，应当就好了。

user: user-2
content: fflush可移植性不好！在VC下都能成功但在gcc下不一定成功，标准不一样，有兴趣可以看看这篇文章http://ydiandiandian.diandian.com/post/2012-05-17/40028316972 linux下可以直接用getchar()消耗就行了  另外你的程序中scanf("ch=%c",&ch)，需要用取地址符&

user: user-7
content: 在每一行的scanf下面再加上一个scanf("%*c")意思是晴空输入流缓冲区里面的一个字符，这里清空的是‘\n’不然即使你的scanf里面变量都加了&，结果你第二个显示永远是个换行符

user: user-8
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。  作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-9
content: 编译器用错了，Linux有两个编译器啊，你用g++还是gcc

user: user-10
content: scanf后面参数加&
user-0 提问: 数组不同赋值方法导致不同结果 [重新发帖，纠正刚才的问题】

回复:
user: user-1
content: 引用 5 楼 registercsdn 的回复:回复二楼 max 如果是这种方式赋值的话，“abcd”它会自动加上结束符号。 我非常同意这个观点

user: user-2
content: 第一种方法没错，第二种方法，{"abcd"}是对char[][]的初始化写法。 如果只是对char[]初始化应该用 char m2[10] = "abcd"

user: user-3
content: m2后面是如何使用的？是不是要通过'\0'来判断

user: user-0
content: 回复四楼zhi_ai_yaya 芯片没有开辟文字常量区，有可能“abcd”，没有地方放，导致赋值的时候数组找不到“abcd”。  这种情况下，可以把“abcd”先放到堆， 栈，或者全局区吗

user: user-0
content: 回复二楼 max 如果是这种方式赋值的话，“abcd”它会自动加上结束符号。

user: user-0
content: 芯片没有问题

user: user-4
content: 可能是芯片的问题吧

user: user-5
content: 验证证明ASCII值为0的是一个null字符。初始化时，没有指定值的，都默认为该值。 事实上m1和m2的值是一样的，但是在芯片上运行出现差别，是因为后面一段没有初始化。没有初始化就使用变量，这不是一个好习惯。
user-0 提问: 函数里的取模有点问题

回复:
user: user-1
content: 我没看清，原来用的就是fmod，抱歉。不过，判断浮点数是否为0，不能用 f != 0.0这样判断.不知道是不是这个原因 你要确定一个精度，比如0.00001 if( f  >= -0.00001 && f <=0.00001)来判断f是否为0

user: user-1
content: 好吧，%这个取模运算只针对整数，浮点数请用fmod函数
user-0 提问: char[100]类型 但是加0就变成char *型了

回复:
user: user-1
content: 地址+ xxx实际上是改变这个地址指向的内存。。 说的不太准确，大致就是这个意思了

user: user-1
content: 数组的名直接拿来用相当于一个内存地址，用地址加xxx不就是地址吗？  地址是指针你懂的 函数名啊 数组名啊什么的都是一个地址

user: user-2
content: 正常的 楼主  这是隐式类型转换  1 //int  1+0.0// double   类似

user: user-2
content: 引用 3 楼 zxh707wk 的回复:ss本来就是char*型的呀 ss本来的数据类型是 char[100]

user: user-3
content: ss[100] 有中括号和数值100，他就是个数组，而且是个字符串数组，因为内容是双引号围住的；  ss就是这个数组的首地址，自然可以用指针表示，就如同用ss[i] 下标表示一样！

user: user-4
content: ss是你明确定义的数组，所以编译器说ss是一个100的char数组，这里的编译器的解释翻译有点点问题，其实没这个类型，不过可以忽略； ss＋0已经把ss从一个数组名隐式转为数组首地址（只有值才支持运算符），变成地址之后肯定就是char *了

user: user-5
content: 建议重新看看数组这一章节。 多留意数组名的含义。或者直接百度。。数组名 这一两句话说不清楚。

user: user-6
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-7
content: 引用 8 楼 lin5161678 的回复:[quote=引用 3 楼 zxh707wk 的回复:] ss本来就是char*型的呀 ss本来的数据类型是 char[100]  [/quote]忘了。。。

user: user-8
content: 这里char *和字符数组都表示字符串，可以理解为等价 关于字符串，可以看看这里——http://blog.csdn.net/u012421456/article/details/38645335

user: user-7
content: ss本来就是char*型的呀

user: user-9
content: 这就是传说中的隐式转换。

user: user-10
content: 如果不是char*，你觉得应该是啥类型呢？
user-0 提问: #########数字魔术游戏#########

回复:
user: user-1
content: 重要的是数组的元素啊

user: user-2
content: 楼主我转帖了哈

user: user-2
content: 仔细看 肯定懂得！

user: user-3
content: 现在的数组规模稍微扩充一点点就可以算出1-63了，还是看得有点晕，我再琢磨下

user: user-0
content: 没啥功能，就是一个数字魔术的小游戏。  游戏的玩法如下，  可以把六组数字想象成6张卡片。 游戏开始时，先让对方在心里面想一个数（1到60之间）， 然后问对方想的数字在不在第一张卡片里，以此类推， 直到第6张卡片让对方看完后，就可以推断出对方心里想到的数字了， 至于原理嘛，程序里写的很清楚，哈哈。

user: user-4
content: 说说原理，我们也好改进

user: user-5
content: 终于能看懂程序了

user: user-6
content: 功能，效果，原理啥都基本的介绍下撒

user: user-7

user: user-0
content: game..........

user: user-8
content: 做啥的？

user: user-0
content: ding!!!!!!!!!!!!!

user: user-9
content: 没整明白是什么意思。。。。
user-0 提问: 求教emIDE安装后的JLink菜单问题

回复:
user: user-1
content: 老的版本，比如V2.08是有jlink菜单的，新版本V2.20是没有的，相关功能分散到其他菜单下边了。好了，楼主可以结贴了。

user: user-1
content: 遇到和楼主一样的疑惑。。。

user: user-2
content: vs2013路过。。。
user-0 提问: 数组不同赋值方法导致不同结果

回复:
user: user-0
content: 无法重新编辑帖子，修正请看四楼

user: user-0
content: 不好意思，题目说错了。并非c不过关。 全都定义都是char，不小心写成int， 方法1中，用0来标记结束是自己规定的，没有说清楚。

user: user-1
content: 第一个，'a' 是ANSIC字符，当然是正确的． 第二个数组，"abcd"是常量字符串，当然不能用int数组来初始化！ 楼主，该去学习Ｃ＋＋／Ｃ基础知识，明显基础不过关呀！

user: user-2
content: 引用 1 楼 zhi_ai_yaya 的回复:m1[0]=97,m1[1]=98,m1[2]=99,m1[3]=100,m1[4]=0。而m1[5]-m1[9]因为没有指定值，所以可能是默认为0，也可能是一个随机值。别胡说 有初始化 没指定的值的元素 默认初始化为 0  不会有其他的情况

user: user-3
content: 引用 楼主 mfcappwizard 的回复:方法1 int m1[10] = {'a', 'b', 'c', 'd', 0} 写0， 是为了标记最后一个，表明结束，运行成功  方法2 int m2[1] = {"abcd"} 运行失败，提示不能找到相应地址块     我认为上面个两种方法是对等的，为什么会一个成功，一个不同通过？ 我是在芯片上做的模拟运行，难道是因为芯片缺少某个分区导致的失败？  谢谢。 方法1 int m1[10] = {'a', 'b', 'c', 'd', 0} 写0， 是为了标记最后一个，表明结束，运行成功 红色标记的那句话是错误的。 那句代码的本质是： 申请一个10个元素的int型数组，并使用{'a', 'b', 'c', 'd', 0}这5个元素初始化，字符a对应的ASCII值是97，所以m1[0]=97,m1[1]=98,m1[2]=99,m1[3]=100,m1[4]=0。而m1[5]-m1[9]因为没有指定值，所以可能是默认为0，也可能是一个随机值。  方法2 int m2[1] = {"abcd"} 这尝试使用一个字符串常量去初始化一个int型变量，肯定报错。  int和char可以根据ASCII值隐式转换，但是字符串不提供，只能进行显示转换。  lz的基础知识还不过，要回去恶补下噢。不断学习才能不断进步。
user-0 提问: 如何将一个二进制文件进行倒序输出，要求速度？

回复:
user: user-1
content: 小文件用 map 大文件分块map 可能是最快的吧

user: user-2
content: 我想问下8楼，程序的32行那个地方为什么是-2呢？我试着把它改成-1结果好像死循环了……新手表示有点不太理解，有没有大神能帮忙解答一下？谢谢！

user: user-3
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-3
content: 仅供参考#include <stdio.h> #include <string.h> #include <conio.h> FILE *fi,*fo; int i; int main(int argc,char **argv) {     if (argc<3) {         printf("Usage:%s src des\n",argv[0]);         return 1;     }     if (0==stricmp(argv[1],argv[2])) {         printf("Src and des is same!\n");         return 2;     }     fo=fopen(argv[2],"wb");     if (NULL==fo) {         printf("Can not create file %s\n",argv[2]);         return 3;     }     fi=fopen(argv[1],"rb");     if (NULL==fi) {         fclose(fo);         printf("Can not find file %s\n",argv[1]);         return 4;     }     i=0;     fseek(fi,-1L,SEEK_END);     while (1) {         fputc(fgetc(fi),fo);         i++;         if (i%1000000==0) cprintf("\r%dKB",i/1000);         if (fseek(fi,-2,SEEK_CUR)) break;     }     fclose(fi);     fclose(fo);     cprintf("\r%dKB OK.\r\n",i/1000);     return 0; }

user: user-4
content: 引用 6 楼 xhw88398569 的回复:打开文件之后让文件指针指向文件最后？读取然后再对每个字节的每一位进行操作，这样感觉太慢了。。。[/quote]可以一次读取一块数据

user: user-5
content: 引用 1 楼 zxh707wk 的回复:打开文件之后让文件指针指向文件最后？读取然后再对每个字节的每一位进行操作，这样感觉太慢了。。。

user: user-6
content: 用文件偏移量反着定位读

user: user-7
content: 从文件尾开始读啊，读一块出来，倒序输出，文件指针往前移，再读一块出来，倒序输出。

user: user-8
content: mmap最快吧

user: user-9
content: 要速度就上scsi磁盘阵列。 这个场景基本上和你的代码写啥样没太大关系。

user: user-4
content: 打开文件之后让文件指针指向文件最后？
user-0 提问: 纯C语言实现二叉树，不知道这样写有什么问题没，大神们给点意思，数据结构菜鸟求指点。

回复:
user: user-0
content: 引用 1 楼 lisong694767315 的回复:在main函数里多进行几次测试，测试正确就没有问题咯....... 嗯嗯，可以试一下的，因为找到的资料要么用java写的，要么用c++写的，这个是从那些里面转化过来的，不知道大方向有没有问题

user: user-1
content: 在main函数里多进行几次测试，测试正确就没有问题咯.......
user-0 提问: 关于模块化编程.....

回复:
user: user-1

user: user-2
content: 小到以函数为单元测试，然后以文件为单元测试，接着以大模块为单元。 总之先确认每个小模块都能正确运行。 修改增删都能以模块操作。对其他模块影响很小。

user: user-3
content: 引用 2 楼 qq_18237229 的回复:引用 1 楼 cyd54454 的回复:简单的就是一个函数一个功能，一次测试一个函数，确定其功能是正常的。比如说，你要写入一个数，把这个数+1后，输出，就可以分成，get_num(),increase_num(),print_num()三个函数。先测试3个函数功能是否正确，在正确的基础上，看看组合起来测试是否正确。那那三个函数测试的时候怎么看出效果？ 调试

user: user-4
content: 模块化，也就是高内聚，低耦合！ 相互不依赖，彼此独立开来，每个模块，能在一个main函数的启动下，正常运行。。

user: user-5
content: 可以看看这几个——http://wenku.baidu.com/view/8b6bf3ecaeaad1f346933fbf.html ——http://wiki.mbalib.com/wiki/模块化设计 ——http://blog.csdn.net/zhzht19861011/article/details/5974945

user: user-6
content: 单元测试，先测试一个单元（小到一个函数），然后再集成测试。。。

user: user-0
content: 引用 1 楼 cyd54454 的回复:简单的就是一个函数一个功能，一次测试一个函数，确定其功能是正常的。比如说，你要写入一个数，把这个数+1后，输出，就可以分成，get_num(),increase_num(),print_num()三个函数。先测试3个函数功能是否正确，在正确的基础上，看看组合起来测试是否正确。那那三个函数测试的时候怎么看出效果？

user: user-3
content: 简单的就是一个函数一个功能，一次测试一个函数，确定其功能是正常的。比如说，你要写入一个数，把这个数+1后，输出，就可以分成，get_num(),increase_num(),print_num()三个函数。先测试3个函数功能是否正确，在正确的基础上，看看组合起来测试是否正确。
user-0 提问: 请问各位大神以下的Keil编译错误是不是代码超过2KB了？？请问该怎么解决呢？

回复:
user: user-1
content: 版本有问题，正常的Keil是收费的，LZ需要找个破解工具破解下才能舒服的用keil

user: user-2

user: user-3
content: 印象当中是keil没有破解。搜 “51keil破解”
user-0 提问: 关于自学C语言

回复:
user: user-1
content: 敲代码了么？ 读的懂，不一定写的出来的哦

user: user-2
content: 动手实践第一

user: user-3
content: 看的时候如果只是和看小说一样的看了一次，那就从新看，这次要边看边实际上机练习

user: user-4
content: 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

user: user-5
content: 同是天涯沦落人！我跟你差不多，这玩意学完一本书，做了几个一般般的小软件后就去找开发团队吧。有开发团队愿意接纳你，里面有人带你，几个项目做下来，基本就算是入门了。可惜的是，愿意给咱提供机会的团队很少。个人建议，继续学习，一边学，一边找用人单位。最好是找那种对你比较包容的团队，一个压抑的环境下你学东西效率不会高的。对新手来说，自己压力大的同时还要时时担心被别人指责，这样的环境生活不爽，而且对自己最后一点的自信都可能失去。如果一时找不到合适的开发团队，不妨先去做测试，等待时机再谋转行开发。

user: user-6
content: 书看完，习题做完

user: user-7
content: 要自己写一些代码。。。然后调试查错。。先把基础过一遍吧。。

user: user-0
content: 引用 1 楼 user-8 的回复:继续看书！！~~你要看的书还很多！~~非常多！真的！~~看你往哪个方向发展，比如我学WIN32，在啃《WINDOWS程序设计》如果是关于软件开发应该怎么看？比如处理一些数据什么的。

user: user-8
content: C语言进阶方面的书也很多，我是学的C++起步的，C语言只看了一本谭浩强的书，之后就是C++的各种书，C++ priner plus,C++primer,C++编程思想，再是现在WIN32

user: user-8
content: 呵呵！~你会越学越发现自己的渺小与计算机世界的浩瀚，特别是给你一种你永远都学不到头的感觉！~~

user: user-8
content: 继续看书！！~~你要看的书还很多！~~非常多！真的！~~看你往哪个方向发展，比如我学WIN32，在啃《WINDOWS程序设计》
user-0 提问: 怎么设置才能让VS2013生成Makefile

回复:
user: user-1
content: 竟然要用makefile 就不要用vs了。。

user: user-2
content: Makefile 不是linux 上的吗，怎么会用vs2013生成， 要么你装了qt助手！ 我自己一般习惯自己写！或许我孤陋寡闻了，等高手解答了！

user: user-3
content: 引用 4 楼 zhao4zhong1 的回复:在MSDN中搜vcbuild和msbuild+1

user: user-4
content: 在MSDN中搜vcbuild和msbuild

user: user-5
content: http://social.msdn.microsoft.com/Forums/vstudio/en-US/c82e9a55-aab6-4a00-8e23-4f2cec696caf/how-to-generate-a-makefile-with-visual-studio?forum=vclanguage
user-0 提问: linux c上printf函数实现问题

回复:
user: user-1
content: 还有记得一定养成好的习惯，有open必有close，你给出的demo里面。你open了ttt.c这个文件却没有close，虽然程序结束会自动关闭所有打开的file descriptor，但是主动自觉的去关闭自己已经打开的file descriptor是个好习惯。 God bless you

user: user-1
content: lz看这个，what will happen？ #include<unistd.h> #include <sys/types.h> #include <sys/stat.h> #include<fcntl.h> #include<stdio.h>  int main(void) {      int fd;       fd = open("./hello.c",O_WRONLY|O_APPEND,0644);      dup2(fd,1);      printf("fd,%d &fd :%p",fd,&fd);       close(fd);       return 0 ; }

user: user-2
content: 引用 15 楼 u011367985 的回复:明白了，有点打错了

user: user-3
content: 因为i是局部变量，放在stack中. 一个程序的内存stack一般放在高地址， 所以i的地址接近0x80000000, 以%d打印的话，如果最高位是1就会被当作负数打印出来。

user: user-0
content: 引用 5 楼 misskissC 的回复:在2‘s complement下，以%d访问&i值若最高位，若&i的最高位为1则会被当成负数。如果要输出&i的值： printf("%u\n", &i);  or printf("%p\n", &i);  我是问为什么打印不出i=1，不是打地址，%u打出啦一个很大的数

user: user-0
content: 引用 8 楼 chenzhuoxue 的回复:i 里的值1就是文件描述符，不需要打它的地址 。  你要用%d打印它的地址， 你加一个强制转化试试      （int）&i 这会报错的

user: user-0
content: 明白了，有点打错了

user: user-4
content: 学习了~~~

user: user-0
content: 引用 12 楼 DIGGOD 的回复:因为i是局部变量，放在stack中. 一个程序的内存stack一般放在高地址， 所以i的地址接近0x80000000, 以%d打印的话，如果最高位是1就会被当作负数打印出来。请问该用什么打呢？另外我打的是数值，和地址有什么关系

user: user-5
content: i 里的值1就是文件描述符，不需要打它的地址 。  你要用%d打印它的地址， 你加一个强制转化试试      （int）&i

user: user-6
content: 引用 6 楼 zxh707wk 的回复:打印地址可以用十六进制格式输出 +1

user: user-7
content: 引用 8 楼 chenzhuoxue 的回复:i 里的值1就是文件描述符，不需要打它的地址 。  你要用%d打印它的地址， 你加一个强制转化试试      （int）&i地址可没有正负位

user: user-7
content: 打印地址可以用十六进制格式输出

user: user-2
content: 在2‘s complement下，以%d访问&i值若最高位，若&i的最高位为1则会被当成负数。如果要输出&i的值： printf("%u\n", &i);  or printf("%p\n", &i);

user: user-8
content: 引用 2 楼 u011367985 的回复:[quote=引用 1 楼 user-8 的回复:] 你打印的是i的地址, 确定这个是你的意图? 是打印啦i的地址，我觉得i应该等于文件描述符1，这样printf才能打印到ttt[/quote] 嗯,明白你的意思了, 我对这个现象也挺好奇, 不过我这里的现象跟你好像不太一样. 我在open之后, i确实是1但printf打印不到 ttt.c 里面, 但 write(1,"abcde",5);这样可以. 猜想因为printf其实还是跟stdout直接关联的, 直接把FILE里的 descriptor关掉再开, 可能没那么无缝对接吧. 至少设备类型就不一样.  gcc version 4.9.1

user: user-2
content: 楼主在看《LC编程一站式学习》？ &i类型与%d的不匹配，类型转换（unsigned  to signed）得到结果。

user: user-0
content: 引用 1 楼 user-8 的回复:你打印的是i的地址, 确定这个是你的意图? 是打印啦i的地址，我觉得i应该等于文件描述符1，这样printf才能打印到ttt

user: user-8
content: 你打印的是i的地址, 确定这个是你的意图?
user-0 提问: linux下面curses库的应用出现问题

回复:
user: user-0
content: 不要沉啊，求大神指教！

user: user-0
content: 大神呢刚加了分，求解决方案

user: user-1
content: 对于这种刚发的帖子，我总是毫不犹豫的顶了。如果火了就是个前排，可以混个脸熟，说不定谁好心就给粉了…稳赚不赔；如果沉了就感觉是我弄沉的，很有成就感，还能捞经验。
user-0 提问: linux 在使用2M带宽网络进行socket通信时创建socket失败

回复:
user: user-0
content: 10台左右ulimit设置过了

user: user-1
content: 你用多少台电脑做客户端的？

user: user-0
content: 这是服务端代码，bind了就是服务端的，客户端只是循环的connect 没什么东西

user: user-2
content: 服务端的代码有么？

user: user-0
content: socket创建部分我可以拿出来，但是感觉跟代码无关，我本地测试没问题，经2M网络测试不可以， 感觉也有可能我select时参数不对         if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0)         {             //_socket_errno = CONN_SOCKET_ERR;              close(sockfd);             return -1;         }          bufSize = 131072;          if(setsockopt(sockfd,SOL_SOCKET,SO_SNDBUF,&bufSize,sizeof(bufSize))<0)         {             //printf(" telcom SO_SNDBUF err\n");         }         if(setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&bufSize,sizeof(bufSize))<0)         {             //printf(" telcom SO_RCVBUF err\n");         }         if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&bufSize,sizeof(bufSize))<0)         {             //printf(" telcom SO_REUSEPORT err\n");         }  printf("bind(sockfd,(struct sockaddr *)&srvAddr,sizeof(srvAddr))\n");         if(bind(sockfd,(struct sockaddr*)&srvAddr,sizeof(srvAddr))<0) 以上是我创建socket时候的参数 希望能对应我2M网络环境给予分析，非常感谢

user: user-2
content: 请贴下关键代码。
user-0 提问: 请教一个数组的问题，谢谢

回复:
user: user-1
content: 要么使用一个整数记住行数，要么使用特殊值标识空行，否则是没有其他办法的。 所以，才会有封装出来的容器：vector。用着方便。

user: user-2
content: 引用 4 楼 u011718046 的回复:[quote=引用 3 楼 misskissC 的回复:] 如：         int i, j;         char ename[11][10];          for ( i = 0; i < 3; ++i) {                 for (j = 0; j < 10; ++j){                         ename[i][j] = i + j;                 }         }   在程序中记住i的值。   我没想明白一个问题，就是 char xx[10] 其实是一个字符串 ，那么怎么来表示一个字符串数组呢？ 比如 aa12 ff66 3300 [/quote] 字符串（字符数组）char  xx[10];每个元素存一个字符。 字符串数组 char  *xx[10];每个元素可以存一个字符串的首地址。

user: user-3
content: 结贴的时候给点分，不懂可以细聊。

user: user-3
content: char ename[11][10];  上面这句，你已经定义了字符串数组，表示11行字符串，每行字符串可以有10个字符。

user: user-3
content: 你定义n行的数组可以可以随便填几行，但不能超过n行，内核不会知道你填了几行，它为你分配了你定义的数组所需要的空间，就算你不填里面数组里还是有别的东西的了，所以不会知道你插不插入。所以定义时最好先初始化，不然打印的时候会出现很多乱码。

user: user-0
content: 引用 3 楼 misskissC 的回复:如：         int i, j;         char ename[11][10];          for ( i = 0; i < 3; ++i) {                 for (j = 0; j < 10; ++j){                         ename[i][j] = i + j;                 }         }   在程序中记住i的值。   我没想明白一个问题，就是 char xx[10] 其实是一个字符串 ，那么怎么来表示一个字符串数组呢？ 比如 aa12 ff66 3300

user: user-4
content: 可以, 但C语言没法知道你只有3行, 除非你用额外的机制区分, 比如没数据的行用一个特殊的值表示

user: user-2
content: 如：         int i, j;         char ename[11][10];          for ( i = 0; i < 3; ++i) {                 for (j = 0; j < 10; ++j){                         ename[i][j] = i + j;                 }         }   在程序中记住i的值。

user: user-2
content: 记住你插入三行的这个变量值。
user-0 提问: 数组作为参数传递或返回值的相关问题

回复:
user: user-1
content: 不可以传数组，所谓的传数组实质上传的都是数组的指针/数组名/首地址，所以访问传递的指针指向的内容，就可以实现“双向传递”了。 另外，一般需要传递数组长度，以避免指针访问越界。

user: user-2
content: 思考一下为什么没人将整个互联网内容作为函数参数或返回值呢？

user: user-3
content: 引用 1 楼 zxhuser-5 的回复:双向传值 #include <stdio.h>  void start_num(int a[],int len) { 	int i; 	for(i=0;i<len;i++) 	{ 		a[i]=i; 	} }  void put_num(int a[],int len) { 	int i; 	for(i=0;i<len;i++) 	{ 		printf("%3d",a[i]); 	} }  int main() { 	int a[10]; 	start_num(a,10); 	put_num(a,10); 	getchar(); 	return 0; }  OR    void start_num(int  *a,int len) {     int i;     for(i=0;i<len;i++)     {         a[i]=i;     } }

user: user-4
content: 一维数组 void fun(int *a)，或 void fun(int a[]) 二维数组 A[10][5] void fun(int a[][5]) 以此类推。 传递的是地址，可以在调用函数里用读、写进行传递

user: user-5
content: 双向传值 #include <stdio.h>  void start_num(int a[],int len) { 	int i; 	for(i=0;i<len;i++) 	{ 		a[i]=i; 	} }  void put_num(int a[],int len) { 	int i; 	for(i=0;i<len;i++) 	{ 		printf("%3d",a[i]); 	} }  int main() { 	int a[10]; 	start_num(a,10); 	put_num(a,10); 	getchar(); 	return 0; }
user-0 提问: error C2228: left of '.GetPos' must have class/struct/union type

回复:
user: user-1
content: 就是说m_sldThresh和m_editThresh不是类或结构体不能使用.操作符，估计你那两个变量是指针吧，改->试试...

user: user-2
content: 引用 2 楼 angel_su 的回复:就是说m_sldThresh和m_editThresh不是类或结构体不能使用.操作符，估计你那两个变量是指针吧，改->试试...+!

user: user-0
content: 大神都在哪

user: user-3
content: 引用 4 楼 qq_19530589 的回复:引用m_sldThresh这个变量怎么定义的  这段程序是我在网上下的   可是他并没有定义 它  必须有定义，在别的文件里吧。  估计这是指针，用 m_sldThresh->GetPos(); 试试看

user: user-0
content: 引用m_sldThresh这个变量怎么定义的  这段程序是我在网上下的   可是他并没有定义 它

user: user-4
content: m_sldThresh这个变量怎么定义的
user-0 提问: 想学一下c语言

回复:
user: user-0

user: user-1
content: 如果你是相关专业的大一学生 就跟着学校课程 再买本好书   如果周围没有环境 可以选择《写给大家看的C语言书》或者《head first C》，比较轻松 好入门
user-0 提问: AT89S52用C语言编是否可以完成以下方案

回复:
user: user-1
content: 定时器1用来产生定时中断控制输出信号 定时器2由四个按键控制，接同一个外部中断，在单片机外部另接其他引脚加以区分，当任一按键按下时，在外部中断处理函数中修改频率，如果按键依然是按下状态，则开始定时器2，，计满1.5s（至于怎么实现1.5s再想办法吧，好像不能直接实现1.5s），定时器2溢出，在定时器超时处理函数中，快速修改频率并刷新显示，当按键状抬起产生中断时，定时器2复位

user: user-2
content: 看你的频率最大是99就当100吧，周期是 10ms, 如果占空比是1%，那%1 高电平的时间就是 10ms /100 = 0.1ms, 定时器刚好满足out,可out*的宽度是out的1/3，这个用定时器实现不了，当然用C语言实现不了。  结论就是如果用定时器来产生pwm不可行。 如果你的晶振是12M的，那指令周期就是T = 12 × 1/12M × 4 = 4uS。  要想实现这个方案，只能用汇编来写，利用汇编指令来延时来达到输出pwm波形。

user: user-3
content: 能把，楼上正解

user: user-4
content: 能把，楼下正解
user-0 提问: 文件结尾问题

回复:
user: user-1
content: 这颜色亮瞎眼...

user: user-2
content: 充满激情的颜色！

user: user-3
content: 1.在linux的stty raw模式中，输入什么就直接扔getchar，不缓存 2.一般情况下，控制台输入的内容先扔缓存，按回车之后表明输入结束，getchar才从缓存中取数据返回 读到EOF结束符如果EOF前有其它数据，这个EOF表示是这些数据的结束,之后输入的任何数据都不要让getchar读，而非本次输 入的结束，只有前面没有数据的EOF才算是一次输入的结束，这样的EOF可以起到如下作用： 因为回车符也算一个字符，一次输入结束有时不打算把回车符计算进去，比如，第一次输入123，第二次输入时，我们希望从123之后 接着输入abc，而非另起一行，这时，如果输入123回车，再输入abc回车，得到的是 123 123 abc abc 所以这时应该输入123EOF回车，然后输入abc回车，得到的是 123EOF 123abc abc

user: user-4
content: Linux：Ctrl+D Windows：Enter，Ctrl+Z，Enter

user: user-5
content: 这颜色。。。 这代码。。。 这路径名。。。 看着真TM蛋疼。。。

user: user-6
content: 这颜色亮瞎... 前面没有内容 也就是新的一行才行

user: user-7
content: 在一行的开始处键入ctrl^Z表示结束。

user: user-8
content: abdd^Z 4    用你的代码运行没有问题。你看看运行环境吧

user: user-9
content: 虽然有点看明白  但你把ch定义为整形了，而EOF好像是字符吧
user-0 提问: 新手求教导。。。。。。。。求大神帮忙

回复:
user: user-1
content: http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装

user: user-2
content: 引用 7 楼 u012421456 的回复:C-Free5.0——http://download.csdn.net/detail/u012421456/7374337哎呦喂，csdn下载页改版了

user: user-3
content: C-Free5.0——http://download.csdn.net/detail/u012421456/7374337

user: user-4
content: 不管用啥，一开始就用 反汇编 练习着可能学得更快。

user: user-2
content: vc、vs2013、wintc、cfree、Dev c++、gcc

user: user-5
content: Code::Blocks：http://www.codeblocks.org/downloads/26

user: user-0
content: 有链接么 顺便指导下安装就好了 我可是 菜鸟中的菜鸟

user: user-6
content: 用linux吧，gnu 编译器比较好。

user: user-6
content: -->virtual box-->linux-->gcc/g++
user-0 提问: 求解，vs08 想在定义的函数里包含头文件

回复:
user: user-1
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-2
content: 引用 4 楼 Mr_Tutu 的回复:引用 2 楼 user-4 的回复:what 不对 means？？  应该是 ctype.h 吧

user: user-3
content: 本人很懒，不想打这么长的代码

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”谢谢，，呜呜

user: user-0
content: 引用 5 楼 zilaishuichina 的回复:引用 4 楼 Mr_Tutu 的回复:[quote=引用 2 楼 user-4 的回复:] what 不对 means？？  应该是 ctype.h 吧[/quote]我去！！谢谢啊

user: user-0
content: 引用 2 楼 user-4 的回复:what 不对 means？？

user: user-0

user: user-4
content: what 不对 means？？

user: user-0
content: 在VS2008里
user-0 提问: 求助！vs2008里面没有conio.h怎么办

回复:
user: user-1
content: COORD stCoord; HANDLE hConsoleOut=GetStdHandle(STD_OUTPUT_HANDLE); stCoord.X=20; stCoord.Y=10; SetConsoleCursorPosition(hConsoleOut,stCoord);

user: user-2
content: 查查控制台相关的WIN32API，我记得应该是有光标定位的函数的。

user: user-0
content: 引用 1 楼 movsd 的回复:conio.h文件是有的，gotoxy函数是没有的，那个是TC里的函数 那我在vs2008里面怎么运行这个程序呢

user: user-1
content: conio.h文件是有的，gotoxy函数是没有的，那个是TC里的函数

user: user-3
content: 引用 7 楼 movsd 的回复:[quote=引用 5 楼 zxx150633 的回复:] [quote=引用 4 楼 movsd 的回复:]  COORD stCoord; HANDLE hConsoleOut=GetStdHandle(STD_OUTPUT_HANDLE); stCoord.X=20; stCoord.Y=10; SetConsoleCursorPosition(hConsoleOut,stCoord);  我是储蓄者，不太明白这是什么意思呢 [/quote] 自己写个gotoxy  void gotoxy(short int x,short int y) { 	COORD stCoord; 	HANDLE hConsoleOut=GetStdHandle(STD_OUTPUT_HANDLE); 	stCoord.X=x; 	stCoord.Y=y; 	SetConsoleCursorPosition(hConsoleOut,stCoord); } [/quote]+1

user: user-1
content: 引用 5 楼 zxx150633 的回复:[quote=引用 4 楼 movsd 的回复:]  COORD stCoord; HANDLE hConsoleOut=GetStdHandle(STD_OUTPUT_HANDLE); stCoord.X=20; stCoord.Y=10; SetConsoleCursorPosition(hConsoleOut,stCoord);  我是储蓄者，不太明白这是什么意思呢 [/quote] 自己写个gotoxy  void gotoxy(short int x,short int y) { 	COORD stCoord; 	HANDLE hConsoleOut=GetStdHandle(STD_OUTPUT_HANDLE); 	stCoord.X=x; 	stCoord.Y=y; 	SetConsoleCursorPosition(hConsoleOut,stCoord); }

user: user-4
content: conio.h不是C标准库中的头文件，在C standard library，ISO C 和POSIX标准中均没有定义。  如果需要使用此头文件，可以从互联网下载。

user: user-0
content: 引用 4 楼 movsd 的回复: COORD stCoord; HANDLE hConsoleOut=GetStdHandle(STD_OUTPUT_HANDLE); stCoord.X=20; stCoord.Y=10; SetConsoleCursorPosition(hConsoleOut,stCoord);  我是储蓄者，不太明白这是什么意思呢
user-0 提问: 多出来的一个字节去哪里了

回复:
user: user-1
content: 内存对齐。   还有字节在末尾。  《C和指针》、《C常见问题集》、《Linux C 编程一站式学习》等书都有介绍 “内存对齐”。

user: user-2
content: 上面已经回答完了。。。

user: user-3
content: 是对齐的结果。  long的长度是4，struct name被分配4的倍数的空间，比123大的最小的4的倍数是124 所以总长度就是 4 + 124 ＝ 128

user: user-4
content: 内存自动对齐的原因，这个需要看计算机组成原理

user: user-0
content: 感谢各位，学习了

user: user-1
content: 引用 10 楼 w673339759 的回复:[quote=引用 9 楼 misskissC 的回复:] 内存对齐。   还有字节在末尾。  《C和指针》、《C常见问题集》、《Linux C 编程一站式学习》等书都有介绍 “内存对齐”。 long的开始地址和结构体成员的开始地址相差4，即long的大小，我觉的还有必要看下myName的结束地址; 那么为了内存对齐，提高运行效率而补齐字节是不是无法访问到啊？ 在64系统下做了个实验，发现long的大小是8，nam结构体大小是123，但是test的大小是136，name的大小不是因该补齐到124么，加上long的8字节是132，为何是136 [/quote]   printf("sizeof test = %d\n", sizeof(test)); printf("shbzNum start address: %p\n", &test.shbzNum); printf("myName start address: %p\n", &test.myName); printf("myName's fName address: %p\n", test.myName.fName); printf("myName's mName address: %p\n", test.myName.mName); printf("myName's lName address: %p\n", test.myName.lName);   可以看到到底是哪里出现了 “间隙”。

user: user-1
content: 引用 10 楼 w673339759 的回复:[quote=引用 9 楼 misskissC 的回复:] 内存对齐。   还有字节在末尾。  《C和指针》、《C常见问题集》、《Linux C 编程一站式学习》等书都有介绍 “内存对齐”。 long的开始地址和结构体成员的开始地址相差4，即long的大小，我觉的还有必要看下myName的结束地址; 那么为了内存对齐，提高运行效率而补齐字节是不是无法访问到啊？ 在64系统下做了个实验，发现long的大小是8，nam结构体大小是123，但是test的大小是136，name的大小不是因该补齐到124么，加上long的8字节是132，为何是136 [/quote]  myName的结束地址应该是以下输出的“结果” -1. INFO *ptest = &test; ptest++; printf("End of myName's address is:%p\n", ptest);

user: user-5
content: 内存对齐； 请参考：http://blog.csdn.net/yusiguyuan/article/details/23104353

user: user-0
content: 引用 9 楼 misskissC 的回复:内存对齐。   还有字节在末尾。  《C和指针》、《C常见问题集》、《Linux C 编程一站式学习》等书都有介绍 “内存对齐”。 long的开始地址和结构体成员的开始地址相差4，即long的大小，我觉的还有必要看下myName的结束地址; 那么为了内存对齐，提高运行效率而补齐字节是不是无法访问到啊？ 在64系统下做了个实验，发现long的大小是8，nam结构体大小是123，但是test的大小是136，name的大小不是因该补齐到124么，加上long的8字节是132，为何是136

user: user-6
content: 字节对齐，没有了！ 楼上说的空结构体不对的

user: user-7
content: 编译器对变量存储的一个特殊处理。为了提高CPU的存储速度，编译器对一些变量的起始地址做了“对齐”处理。在默认情况下，规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。 类型 对齐方式（变量存放的起始地址相对于结构的起始地址的偏移量） Char 偏移量必须为sizeof(char)即1的倍数 int 偏移量必须为sizeof(int)即4的倍数 float 偏移量必须为sizeof(float)即4的倍数 double 偏移量必须为sizeof(double)即8的倍数 Short 偏移量必须为sizeof(short)即2的倍数

user: user-8
content: 另外，不要在定义41这样古怪的数组长度了，你最好定义成48，这样能够提高程序运行的速度！空的字节就让他空着吧，这就要用空间换时间，至于为这样能够提高程序运行速度，仔细学习学习计算机原理就知道了！

user: user-8
content: 数据对齐的原因，你的结构体大小实际是127字节，你自己看别扭不？编译器在对你的程序优化的时候，自动对齐到128个字节大小，这样能够提高程序运行速度，你的程序没有错，只是有一个字节空在那里，永远也永不到了。

user: user-9
content: 空结构体的大小为1  typedef struct info { 	/* 空结构体 */ }INFO;  int main() { 	printf("%d\n", sizeof(INFO));  // 结果为1 	return 0; }
user-0 提问: 为什么字符串常量能直接给一个字符指针变量赋值呢？

回复:
user: user-1
content: 你为什么 不换一个printf试试呢

user: user-2
content: 一个字符串常量就是一个字符数组，它表示指向字符串首地址的指针。  比如这个例子：  void main() { 	printf("%s\n", "hello");     // 输出hello 	printf("%s\n", "hello"+1);   // 首地址+1，输出ello 	printf("%s\n", "hello"+2);   // 首地址+2，输出llo }

user: user-3
content: 因为在C89标准出来的时候，已经有海量的这样的不顾const特性的代码存在了。 所以，C、C++标准只好在这个地方绕了一个小弯。 知道就行了，别深究了。

user: user-4
content: m存的是M的首地址，哪有问题了？

user: user-5
content: C语言没有定义专门的字符串数据类型，实际通过字符数组实现

user: user-6
content: 是存这个字符串的首地址及h的地址;
user-0 提问: int值转换为字符串，%s格式化输出不来？

回复:
user: user-0
content: 引用 7 楼 cyd54454 的回复:ps[size-1-k]=(n>>k)&01+'0';这句，+优先级高于&，相当于是ps[size-1-k]=(n>>k)&(01+'0');不知道楼主本意y应该是这样吧：ps[size-1-k]=((n>>k)&01)+'0';谢谢

user: user-1
content: ps[size-1-k]=(n>>k)&01+'0';这句，+优先级高于&，相当于是ps[size-1-k]=(n>>k)&(01+'0');不知道楼主本意y应该是这样吧：ps[size-1-k]=((n>>k)&01)+'0';

user: user-2
content: ...warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]                  ps[size-1-k]=(n>>k)&01+'0';

user: user-0
content: 书上的习题，刚好那一张讲的就是位操作

user: user-3
content: 你这代码想干啥，怎么用位运算了？

user: user-0
content: 好眼神，但是请关注重点

user: user-1
content: 不知道你自己调试了没，因为数组第一个元素就是'\0' (gdb) p ps[0]   $9 = 0 '\000'

user: user-3
content: 看来lz用的是虚拟机
user-0 提问: vs2010 mci问题

回复:
user: user-0
content: 以前没用过VS，不了解宽字符这些。感谢诸位大神！！！！

user: user-1
content: 诶 ... 后面加上 wait 试试看呢 ...

user: user-2
content: 有兴趣的可以看看我的用C控制Word文档视频，可以学到不少东西。视频地址如下 http://v.youku.com/v_show/id_XNzU2NjYxNTk2.html  想要清楚的视频，在我的帖子下留下QQ

user: user-2
content: VC2010默认是使用UNICODE，也就是宽字符，VC6使用的是ASCII字符，所以，以后在用VC21010的是有，先看看是不是宽字符，还是ASCII字符，这个首先要搞明白。

user: user-3
content: 引用 7 楼 user-4 的回复:没加L mciSendString(L"open D:\\1.mp3 alias mywav",0,0,0)；+1怎么会这样

user: user-3
content: 把代码展开之后就是这样     mciSendString(L"open \"d:\\1.mp3\"",NULL,0,NULL); //打开设备     mciSendString(L"play \"d:\\1.mp3\" repeat",NULL,0,NULL); //播放

user: user-3
content: 引用 5 楼 gpp135 的回复:wsprintf这个函数都查不到？

user: user-4
content: 没加L mciSendString(L"open D:\\1.mp3 alias mywav",0,0,0)；

user: user-0
content: mciSendString("open D:\\1.mp3 alias mywav",0,0,0)； 这是第一行

user: user-0
content: 引用 4 楼 zxh707wk 的回复:[quote=引用 3 楼 gpp135 的回复:] [quote=引用 2 楼 zxh707wk 的回复:] 你没加" 是说哪没加啊[/quote]你不会自己看代码吗，百度谷歌随你查的居然不去搜[/quote] 我当然是查了各种没查到才来论坛问的啊，你看明白题再说好吗，你要不爱教别墨迹没用的

user: user-3
content: 引用 3 楼 gpp135 的回复:[quote=引用 2 楼 zxh707wk 的回复:] 你没加" 是说哪没加啊[/quote]你不会自己看代码吗，百度谷歌随你查的居然不去搜

user: user-0
content: 引用 2 楼 zxh707wk 的回复:你没加" 是说哪没加啊

user: user-3
content: 你没加"

user: user-0
content: 为什么要分开好几步写啊？？？ 求大神啊？？？
user-0 提问: 为什么说霍夫曼编码的符号频数压缩到可用一个字节(8位)表示时,没有哪一个符号的霍夫曼编码会大于16位?

回复:
user: user-0
content: 我说说我的想法. 其实和16这个数没关系,因为计算机中最小的操作单位是字节(8位),所以如果8位不能表示完整的编码的话,就得扩展为16位.就这么简单

user: user-0
content: 引用 7 楼 angel_su 的回复:不会证明，不过可以想象最小频的节点，最多8次加权就达256，假设剩余都节点是256的话，那就是深度最多8的满树，所以最小频节点深度不超过16，而深度对应编码的位数... 你这个16所以得毫无道理啊,我就问为啥是16,而不是14,12,10呢?

user: user-0
content: 2楼那位说拿笔画画就知道答案,真问他答案他又说不出来

user: user-1
content: 不会证明，不过可以想象最小频的节点，最多8次加权就达256，假设剩余都节点是256的话，那就是深度最多8的满树，所以最小频节点深度不超过16，而深度对应编码的位数...

user: user-0
content: 引用 4 楼 amoyman 的回复:拿一个例子，仔细用笔模拟一下，就什么都清楚了。 例子中的数据不要太多，不然会晕的 那为什么不超过16位?

user: user-0
content: 那为什么不超过16位?

user: user-2
content: 拿一个例子，仔细用笔模拟一下，就什么都清楚了。 例子中的数据不要太多，不然会晕的

user: user-2
content: 书上应该写得很清楚了，为了用短编码来表示常出现的字，那么，那些不常出现的，就必然会超越256

user: user-0
content: 引用 1 楼 amoyman 的回复:好好看书，是教科书，不是现在的那些所谓的科幻小说（特别是那些没学过计算机的人写电脑方面的小说） 没看懂什么意思

user: user-2
content: 好好看书，是教科书，不是现在的那些所谓的科幻小说（特别是那些没学过计算机的人写电脑方面的小说）
user-0 提问: 输入任意结点的双向链表删除问题

回复:
user: user-0
content: 引用 3 楼 angel_su 的回复:双向链表不需要p2指针来记录前驱，直接遍历即可，所以没有你说左边右边的问题...  这个代码不是输入头结点开始遍历，而是输入这个链表中任一结点指针去遍历，所以有可能需要向左和向右遍历两次寻找需要删除的结点。

user: user-1
content: 双向链表不需要p2指针来记录前驱，直接遍历即可，所以没有你说左边右边的问题...

user: user-2
content: 引用 3 楼 angel_su 的回复:双向链表不需要p2指针来记录前驱，直接遍历即可，所以没有你说左边右边的问题...+1，双向链表不需要记住前一个节点

user: user-3
content: 你就是看看百度百科也好啊！  传送门

user: user-3
content: if(p)是判断这个指针是否有效，如果有效则删除这个结点。 你的代码有问题啊，p1,p2都没有指向实例化对象，只是声明了指针，你访问node成员运行不会出错吗？
user-0 提问: 各位大虾请指教！

回复:
user: user-1
content: 少个;？

user: user-2
content: 引用 楼主 u012611445 的回复:#ifndef _BOARD_H_ #define _BOARD_H_  #ifdef __STDC__ /* Type of physical port bitmap */  typedef uint8 pbmp_t;  #endif /* __STDC__ */  #define CFG_SWITCH_VLAN_INCLUDED (1)  /* Number of units */ #define BOARD_NUM_OF_UNITS              (1)  /* Maximal number of ports (may be different than actual port co  结果： ..\SRC\BOARD.H(54): error C129: missing ';' before 'pbmp_t'  #ifndef _BOARD_H_ #define _BOARD_H_  #ifdef __STDC__ /* Type of physical port bitmap */  typedef unsigned char uchar; typedef uchar	uint8;  typedef uint8 pbmp_t;  #endif /* __STDC__ */  #define CFG_SWITCH_VLAN_INCLUDED (1)  /* Number of units */ #define BOARD_NUM_OF_UNITS              (1)  /* Maximal number of ports (may be different than actual port co

user: user-3
content: 这段代码如果uint8能识别的话，没什么问题，可能别的地方引起的

user: user-4
content: 楼上所言极是

user: user-5
content: uint8 可有定义？
user-0 提问: 《C程序设计语言》（Dennis M. Ritchie   Brian W. Kernighan）中一个例题看不懂

回复:
user: user-1
content: 引用 11 楼 chlth007 的回复:引用 7 楼 wanght99 的回复:[quote=引用 6 楼 chlth007 的回复:] [quote=引用 5 楼 wanght99 的回复:] [quote=引用 3 楼 chlth007 的回复:] [quote=引用 1 楼 wanght99 的回复:] 执行程序, 随便敲内容, 满意了之后告知程序输完了(Linux是Ctrl-D, Windows好像是Ctrl-Z), 然后程序会输出你输入的总行数.不管用啊。是我没操作好、？ 你是怎么执行的? 现象是什么? 是不是你输入完之后窗口直接关闭了?[/quote] 好了，我忘了敲回车了。请问Ctrl-Z是做什么的，我看完一本书了，没遇到这个东东，能讲解一下吗？[/quote] EOF是文件到末尾的工具, 但从终端没法直接输入EOF, 所以就把让Ctrl-Z起到EOF的作用, 按Ctrl-Z的时候, getchar()就返回EOF了.[/quote]请问第七行中的c我可以定义成char吗？与定义成int有什么区别？[/quote]  不能改成char getchar返回的是Int, 之所以不返回char就是为了区分EOF, char的值域是0-255, EOF跟任何 char的值不一样, 这样才能起到区分的作用. 你如果把c写成char, 那就会发生强制类型转换, 转换成char值之后, 就没法再判断EOF了.

user: user-0
content: 引用 7 楼 wanght99 的回复:引用 6 楼 chlth007 的回复:[quote=引用 5 楼 wanght99 的回复:] [quote=引用 3 楼 chlth007 的回复:] [quote=引用 1 楼 wanght99 的回复:] 执行程序, 随便敲内容, 满意了之后告知程序输完了(Linux是Ctrl-D, Windows好像是Ctrl-Z), 然后程序会输出你输入的总行数.不管用啊。是我没操作好、？ 你是怎么执行的? 现象是什么? 是不是你输入完之后窗口直接关闭了?[/quote] 好了，我忘了敲回车了。请问Ctrl-Z是做什么的，我看完一本书了，没遇到这个东东，能讲解一下吗？[/quote] EOF是文件到末尾的工具, 但从终端没法直接输入EOF, 所以就把让Ctrl-Z起到EOF的作用, 按Ctrl-Z的时候, getchar()就返回EOF了.[/quote]请问第七行中的c我可以定义成char吗？与定义成int有什么区别？

user: user-0
content: 引用 8 楼 u012421456 的回复:顾名思义，统计输入内容的行数 EOF的用法——http://nylzhaowei.blog.163.com/blog/static/14303922006112012447234/谢谢

user: user-0
content: 引用 7 楼 wanght99 的回复:引用 6 楼 chlth007 的回复:[quote=引用 5 楼 wanght99 的回复:] [quote=引用 3 楼 chlth007 的回复:] [quote=引用 1 楼 wanght99 的回复:] 执行程序, 随便敲内容, 满意了之后告知程序输完了(Linux是Ctrl-D, Windows好像是Ctrl-Z), 然后程序会输出你输入的总行数.不管用啊。是我没操作好、？ 你是怎么执行的? 现象是什么? 是不是你输入完之后窗口直接关闭了?[/quote] 好了，我忘了敲回车了。请问Ctrl-Z是做什么的，我看完一本书了，没遇到这个东东，能讲解一下吗？[/quote] EOF是文件到末尾的工具, 但从终端没法直接输入EOF, 所以就把让Ctrl-Z起到EOF的作用, 按Ctrl-Z的时候, getchar()就返回EOF了.[/quote]谢谢

user: user-2
content: 顾名思义，统计输入内容的行数 EOF的用法——http://nylzhaowei.blog.163.com/blog/static/14303922006112012447234/

user: user-1
content: 引用 6 楼 chlth007 的回复:引用 5 楼 wanght99 的回复:[quote=引用 3 楼 chlth007 的回复:] [quote=引用 1 楼 wanght99 的回复:] 执行程序, 随便敲内容, 满意了之后告知程序输完了(Linux是Ctrl-D, Windows好像是Ctrl-Z), 然后程序会输出你输入的总行数.不管用啊。是我没操作好、？ 你是怎么执行的? 现象是什么? 是不是你输入完之后窗口直接关闭了?[/quote] 好了，我忘了敲回车了。请问Ctrl-Z是做什么的，我看完一本书了，没遇到这个东东，能讲解一下吗？[/quote] EOF是文件到末尾的工具, 但从终端没法直接输入EOF, 所以就把让Ctrl-Z起到EOF的作用, 按Ctrl-Z的时候, getchar()就返回EOF了.

user: user-0
content: 引用 5 楼 wanght99 的回复:引用 3 楼 chlth007 的回复:[quote=引用 1 楼 wanght99 的回复:] 执行程序, 随便敲内容, 满意了之后告知程序输完了(Linux是Ctrl-D, Windows好像是Ctrl-Z), 然后程序会输出你输入的总行数.不管用啊。是我没操作好、？ 你是怎么执行的? 现象是什么? 是不是你输入完之后窗口直接关闭了?[/quote] 好了，我忘了敲回车了。请问Ctrl-Z是做什么的，我看完一本书了，没遇到这个东东，能讲解一下吗？

user: user-1
content: 引用 3 楼 chlth007 的回复:引用 1 楼 wanght99 的回复:执行程序, 随便敲内容, 满意了之后告知程序输完了(Linux是Ctrl-D, Windows好像是Ctrl-Z), 然后程序会输出你输入的总行数.不管用啊。是我没操作好、？ 你是怎么执行的? 现象是什么? 是不是你输入完之后窗口直接关闭了?

user: user-0
content: 引用 2 楼 zxh707wk 的回复:引用 1 楼 wanght99 的回复:执行程序, 随便敲内容, 满意了之后告知程序输完了(Linux是Ctrl-D, Windows好像是Ctrl-Z), 然后程序会输出你输入的总行数.+1具体怎么操作，我怎么操作不好呢。

user: user-0
content: 引用 1 楼 wanght99 的回复:执行程序, 随便敲内容, 满意了之后告知程序输完了(Linux是Ctrl-D, Windows好像是Ctrl-Z), 然后程序会输出你输入的总行数.不管用啊。是我没操作好、？

user: user-1
content: 执行程序, 随便敲内容, 满意了之后告知程序输完了(Linux是Ctrl-D, Windows好像是Ctrl-Z), 然后程序会输出你输入的总行数.
user-0 提问: 用C语言自己实现strcat时遇到的小问题

回复:
user: user-1
content: 你的编译应该不通过，函数返回char*，不能返回char。 如果返回s，只会影响函数的返回值（如果你不使用这个返回值的话，在你看来结果没啥影响），s在经过循环之后已经改变了指向，所以要想得到正确的字符串首地址，必须临时保存起来

user: user-2
content: 在一个字符串追加另一串字符串，你的return不知道有什么用，似乎对结果没影响~

user: user-0
content: 引用 2 楼 lisong694767315 的回复:1、首先，my_strcat函数应该返回des而不是*des 2、不定义des直接返回s，那么你得到的永远是空字符串，因为s指向字符串的末尾，而不是字符串的开头额。。。明白了。 不过难道是编译器除了问题，我改成return *s，结果也是对的

user: user-3
content: 楼上正解！！！

user: user-4
content: 1、首先，my_strcat函数应该返回des而不是*des 2、不定义des直接返回s，那么你得到的永远是空字符串，因为s指向字符串的末尾，而不是字符串的开头

user: user-5
content: 如果不定义*des，结果是错误的。s指向的地址已经改变了，不在指向字符串的首地址了
user-0 提问: 自己定义了一个函数调用时出现程序停止工作

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

user: user-0
content: 引用 5 楼 amoyman 的回复:[quote=引用 3 楼 zxh707wk 的回复:] 本人很懒，不想自己去打代码编译  是啊，为什么不用CODE而要用图片呢[/quote]不好意思哈，新人，我觉得图片看着更爽，复制下来看着又多又密，有种不想看的感觉，下次注意

user: user-2
content: 这个问题，断点然后单步很快就能定位问题了， 数组越界可能性比较大

user: user-3
content: 引用 3 楼 zxh707wk 的回复:本人很懒，不想自己去打代码编译  是啊，为什么不用CODE而要用图片呢

user: user-4
content: 引用 3 楼 zxh707wk 的回复:本人很懒，不想自己去打代码编译  ++

user: user-5
content: 本人很懒，不想自己去打代码编译

user: user-6
content: char s[256]; itob(300, s); cout << s << endl; //0X12c return 0;  没问题啊，是不是你的调用代码有什么问题

user: user-7
content: 我们仔细看，你看看你传进去的数组的大小是否够大，如果超出边界了，肯定有问题，传个大数组试试，另外你的办法也挺别扭的。
user-0 提问: 求c语言比较好的教学视频！！！急需，各位大神求指导

回复:
user: user-1
content: 建议你看书，看视频效率比较低，然后多敲代码。过来人建议，希望有用。

user: user-2
content: 视频耗时，容易走神  还是看书比较好的

user: user-3
content: http://vs2003.net  不是最好的，但是看了肯定是有好处的,只教有缘人

user: user-4
content: 对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！

user: user-5
content: 郝斌的还不错  楼主可以看看

user: user-4
content: 只用大脑和眼睛而不用小脑和手，是永远学不会C/C++或者任何一门软件开发语言的！

user: user-6
content: 郝斌的还不错

user: user-7
content: 翁恺的视频，记得要多加练习，多敲代码

user: user-8
content: 而且看视频容易走神，多看书理论过了，再敲代码！

user: user-9
content: 看视频是最慢最不推荐的一种学习方式。

user: user-10
content: http://www.youku.com/playlist_show/id_18980627.html

user: user-11
content: 看书吧

user: user-12
content: 看视频感觉比看书累
user-0 提问: 初学c的一个小问题

回复:
user: user-0
content: 引用 3 楼 T5500 的回复:因为在IDE Console中运行的关系吧，在终端下运行就是正常的输入输出顺序了  果然是的。。。。

user: user-1
content: 因为在IDE Console中运行的关系吧，在终端下运行就是正常的输入输出顺序了

user: user-0
content: 引用 1 楼 T5500 的回复:你指什么顺序？  不是应该是 数字: 1 is 1  吗

user: user-1
content: 你指什么顺序？
user-0 提问: C语言实现Word文档全控制

回复:
user: user-1
content: 楼主还在吗，现在求视频还可以不？ 3191881056@qq.com

user: user-2
content: suozhaoyu0530@163.com  现在才看到，不知道晚不晚

user: user-3
content: 1196124882@qq.com  楼主给我也发一份吧，谢谢啦

user: user-4
content: 414079745@qq.com  谢谢

user: user-5
content: 恳请楼主务必发送一下，谢谢了！870633352@qq.com

user: user-6
content: 1113501978 楼主好人，给我也发一份吧，急用啊

user: user-7
content: 2441898885

user: user-8
content: 楼主可以给我发一份清楚地吗 最近正好想弄关于这个的  麻烦您了  76132665  谢谢啦

user: user-9
content: 后面关键的事件监视没有了啊。。。。。。。。。。。。。。

user: user-10
content: 79425429

user: user-11
content: QQ:936170014

user: user-12
content: 1075087807

user: user-13
content: 807059450谢谢楼主

user: user-14
content: 楼主还留意这个贴么？邮箱是：ooqazoo@sina.com。而且我想问一下如何用c++而不是mfc去读取word文档

user: user-15
content: 1442454823果然不清晰 啊

user: user-16
content: 楼主，我现在想用c或c++编程实现将word 文档中所有的图片提取出来并自动保存到一个文件夹中，我看百度上有手动的：打开word文档，然后点击“文件——另存为——‘保存类型’选择HTML格式”，即生成同名文件夹里都是该word文档的图片。我想将这个过程用C或C++实现一下。我现在再看楼主在优酷上传的视频，视频不清晰啊，我刚刚看一，想问楼主传的3个视频里有没有这个内容，能给我发一份清晰的视频吗？我的邮箱是874651570@qq.com   非常感谢！

user: user-0
content: 每个coclass就是一个组件，Application就代表整个word的EXE。  类型库是一个库信息，相当于C里面的.h头文件，只不过形式不一样而已。 Application组建当然有自己的UUID了。

user: user-17
content: 我看了LZ的视频，有几个问题想请教： 1、是不是一个应用软件内包含多个COM组件，比如像 在word里，我发现有很多CoClass,是不是每个CoClass 都是一个COM组件？ 2、类型库是干什么的？它里面只包含接口吗？类型库 内是否也包含CoClass组件类？ 3、我看你程序，好像是用Application这个组件来启动  word的，word本身也有UUID吧，为什么不用word本身的 UUID来启动呢？

user: user-18
content: 771233829

user: user-19
content: 楼主，还不如放上代码+注释更受欢迎啊
user-0 提问: 请教一个PRO*c的问题，谢谢

回复:
user: user-1
content: 我也遇到了相似问题。 写在PRO*C里面的数组存储的值在一个while循环后就不见了。 声明为全局变量也是一样。

user: user-0
content: 引用 4 楼 cyd54454 的回复:看你定义在函数体外还是函数体内，函数体外就是全局的，存在数据段里。函数体内是局部的，存在栈里（不加static修饰的）。EXEC SQL BEGIN DECLARE SECTION;EXEC SQL BEGIN DECLARE SECTION;只是声明其之间的这些变量是用在数据库上的，就算你注释掉，程序也是一样运行。如果要放堆里，就要自己malloc 为啥要malloc啊？定义在main函数外不行么？  "EXEC SQL BEGIN DECLARE SECTION;EXEC SQL BEGIN DECLARE SECTION;只是声明其之间的这些变量是用在数据库上" 啥意思啊？啥是用在数据库上？  谢谢

user: user-2
content: 没用过。。。

user: user-3
content: 引用 5 楼 u011718046 的回复:为啥要malloc啊？定义在main函数外不行么？  "EXEC SQL BEGIN DECLARE SECTION;EXEC SQL BEGIN DECLARE SECTION;只是声明其之间的这些变量是用在数据库上" 啥意思啊？啥是用在数据库上？ 谢谢 PRO*C还是以C语言为宿主语言，所以其变量的存放规则是和普通C程序一样的。定义在函数体外的变量只是存在数据段里（一个C程序分布：代码段，数据段，bss段，堆，栈）。那两句话只是声明这些变量是程序与Oracle通信的桥梁，程序的输入数据通过这些变量传递给Oracle，反之，Oracle的输出数据又通过这些变量传递给程序。还有点我说错了，那两句话和预编译的参数parse有关,默认parse=full,所以这两句可以去掉,如果parse=none,那么所有SQL要用到的变量必需加在这两句之间。。。

user: user-3
content: 看你定义在函数体外还是函数体内，函数体外就是全局的，存在数据段里。函数体内是局部的，存在栈里（不加static修饰的）。EXEC SQL BEGIN DECLARE SECTION;EXEC SQL BEGIN DECLARE SECTION;只是声明其之间的这些变量是用在数据库上的，就算你注释掉，程序也是一样运行。如果要放堆里，就要自己malloc

user: user-4
content: 引用 2 楼 u011718046 的回复:[quote=引用 1 楼 Oringe_new 的回复:] 应该是栈。。。。。 其实当你用proc*c把PC文件 宏展开后生成xx.c文件就看到这几个变量是什么存在了 谢谢，那怎样才能放到堆 里呢？或者全局区呢？[/quote] 太久没搞了  以前工作的时候还会搞一下 不清楚了

user: user-0
content: 引用 1 楼 Oringe_new 的回复:应该是栈。。。。。 其实当你用proc*c把PC文件 宏展开后生成xx.c文件就看到这几个变量是什么存在了 谢谢，那怎样才能放到堆 里呢？或者全局区呢？

user: user-4
content: 应该是栈。。。。。 其实当你用proc*c把PC文件 宏展开后生成xx.c文件就看到这几个变量是什么存在了
user-0 提问: 关于使用VS2013和VC++6.0的不同之处

回复:
user: user-0
content: 引用 3 楼 u011836122 的回复:你是要在main函数里调用func对吧？  前面已经声明过了，调用的时候加void（加返回值类型）是不对的！ 谢谢，谢谢，的确是这样的！

user: user-0
content: 引用 3 楼 u011836122 的回复:你是要在main函数里调用func对吧？  前面已经声明过了，调用的时候加void（加返回值类型）是不对的！ 哦，就是说后面就不用加void了吧？

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:你把源代码后缀改为.c再试试。不行啊

user: user-1
content: 你是要在main函数里调用func对吧？  前面已经声明过了，调用的时候加void（加返回值类型）是不对的！

user: user-2
content: 你把源代码后缀改为.c再试试。

user: user-3
content: vs没升级一次，都会增加很多错误检查。
user-0 提问: 【求解】我定义的一个简单函数实参是32时就不正常了

回复:
user: user-1
content: 赵老师说的对，你这样传的参数是int类型，32位的1，其int类型值为-1

user: user-2
content: 将%d改为%u 所有int改为unsigned int

user: user-0
content: 这是函数

user: user-3
content: 结果太大了。你的int型更本装不了。
user-0 提问: 关于sscanf的输入问题

回复:
user: user-0
content: 引用5楼的回复 对于lz你的做法表示无法理解 怎么无法理解了

user: user-1
content: sscanf_s不是sscanf，一个%s对应2个参数，具体去看文档。照理编译时应该有警告吧，不能无视阿...

user: user-0
content: 引用8楼angel_su的回复 sscanf_s不是sscanf，一个%s对应2个参数，具体去看文档。照理编译时应该有警告吧，不能无视阿... 谢啦  还以为一样呢····· 但编译时确实没有警告····

user: user-2
content: 新建工程文件试试

user: user-0
content: 新建工程文件还是错误，，不会是我的vs坏了吧

user: user-0
content: 引用1楼的回复 sscanf_s(a, "%s%s", /*去掉&*/b, /*去掉&*/c);  去掉后还是出现相同的错误··

user: user-3
content: 对于lz你的做法表示无法理解

user: user-4
content: 用strcpy不行吗

user: user-5
content: sscanf_s(a, "%s%s", /*去掉&*/b, /*去掉&*/c);
user-0 提问: 帮我看看这个值是什么算出来的呢？

回复:
user: user-1
content: 根据结构体bit的定义，它占用一个字节(3 + 2 + 3 = 8位)的内存空间  *c   =   0x99;  这条语句初始化了结构体变量s，0x99的二进制形式为10011001，此时内存中的状态：  100   11    001 c     b     a  其中结构体各字段的第一位数值为符号位 字段a是正数直接输出1 字段b是负数，需要对符号位进行扩展：11111111111111111111111111111111，将这个补码转换为原码就是-1 字段c也是负数，符号位扩展后为：11111111111111111111111111111100，转换成原码就是-4

user: user-2
content: struct   bit     {         unsigned int   a:3;       unsigned int   b:2;       unsigned int   c:3;   };
user-0 提问: Linux 条件变量 为什么要配合互斥锁

回复:
user: user-1
content: 引用 楼主 forlove89 的回复:Linux 条件变量 为什么要配合互斥锁 进行操作 为什么不在条件变量内部不能自己实现互斥锁  因为物理微观上多线程cpu的出现，导致微观上数据的并发完全成为现实，所以为了保证数据的一致性，正确性， 涉及到共享的变量必须上锁，以保证该过程不会被打断，意外并发等造成的错误

user: user-2
content: 来源man手册：A condition variable must always be associated with a mutex,  to  avoid        the race condition where a thread prepares to wait on a condition vari‐        able and another thread signals the condition  just  before  the  first        thread actually waits on it. 这应该能回答你的问题了
user-0 提问: 问下显示行数的软件是什么？

回复:
user: user-1
content: vc里面的一个选项吧。。。有个是否显示行号的选项

user: user-2
content: 我用的VC6LineNumberAddin这个，挺好用的

user: user-3
content: vim qtcreator == 很多。
user-0 提问: C语言新手问题

回复:
user: user-1
content: 2楼正解，传递给函数的是数组元素，不是数组的地址，如果传递&iShuZu[i],那么这样就是把数组的每个元素的地址传递给函数，函数的参数类型应该声明为指向int的指针类型(int * p)，并且printf时要使用各式说明符(%p)，而不是%d指针指向的是一个存储某些数值的地址，对指针取值(*)，即是取出存储在指针指向的地址中存储的值，重在理解

user: user-2
content: 自己把代码打一遍就知道那个是正确的了

user: user-3
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-4
content: 引用 楼主 Cristiano001 的回复: 我的问题是: 书上说：当数组作为函数实参时候，只传递数组的地址，而不是将整个数组赋值到函数中； 那main函数中Aaa（iShuzu[i]）中的iShuzu[i]传递到被调用函数的时候应该就是iShuzu[i] 的地址啊 既然是地址那最后printf输出的也应该是数组的地址啊。 为什么在被调用程序中输出的却是每个数组元素的值，而不是数组元素的地址呢？求解  我在数组和指针上要蒙圈了 因为形参的类型，限定了实参的类型，你传入的是数组中的一个元素，所以，和形参的类型一样，所以正常啊。

user: user-5
content: iShuzu[i]是数组吗？iShuzu[i]是一个数组元素，不是数组。  你没有搞清楚数组和它们元素的关系

user: user-6
content: 数组（准确点讲应该叫“数组名”）和数组元素是两个不同的概念。数组名是一个地址(即指针)，它指向数组中的第一个元素的地址；而数组元素本质上就是一个个变量。  就拿楼主的例子来说，数组(名)是iShuzu(不带有中括号)，而数组元素则是iShuzu[i]。楼主可以试着打印*iShuzu，它的结果应该是第一个数组元素0.

user: user-7
content: iShuze作为参数时才会作为指针，加上下标运算符[]后的iShuze[i]返回的是一个右值

user: user-8
content: iShuzu[i] 代表的是值，你Aaa传入的是一个int值，而不是数组呀。 比如i=0，iShuzu[i]=0，你传入的是0这个值。  你的Aaa函数需要的只是一个int型实参，而不是一个数组啊

user: user-0
content: 牛B的勇士你在哪