Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 数据结构查找删除操作哪里出错了

回复:
user: user-1
content: ElemType *e1;     int *pos; 把这两个指针换成变量pos和e1，传递进函数ListLocate(&L,4,&pos)和ListDelete_sq(&L,2,&e1)中，就 不会报错了，在这两个函数中，有*pos = i;和 *e=L->slist[i-1];，对这两个指针赋值了，但你还没有对这两个指针分配内存，所以会报访问非法内存的错误。

user: user-0
content: 我想知道为什么指针用了就错

user: user-2
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-3
content: 我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《C/C++泛型编程实现数据结构之线性表》, 一起来围观吧 https://blog.csdn.net/qq_27180763/article/details/82656677

user: user-4
content: ElemType *e1 = new int; int *pos = new int; 末尾加上 if(pos) delete pos; if(e1) delete e1; 饭要一口一口吃，你在学习链表的时候，最好先别掺杂上一些影响代码阅读的东西，要分清主次。其次你的命名让人看了很难受（int的重命名没感觉出来有什么必要，反而使代码更加晦涩难懂，带大小写和下划线的命名方法好像有点不太规范。。），我也是小白，共同学习，共同进步吧。
user-0 提问: 小白一个， 想问一下函数的参数为二维指针的问题

回复:
user: user-1
content: 另外，举个二维数组，正确操作的例子。  #include <stdio.h>                                                                                                                        void lian(int p[][3]); int main(void) {     int shu[2][3] = { {1,2,3}, {4, 5, 6} };     printf("shu point is %p\n", shu);     printf("*shu point is %p\n", *shu);     lian(shu);     return 0; }  void lian(int shu[][3]) {     printf("shu point is %p\n", shu);     printf("*shu point is %d\n", shu[1][1]); }  另外，也可以参考我的博客： https://blog.csdn.net/zxc024000/article/details/78957907

user: user-1
content: 问题的原因在于，有几个： 首选： 对于，二维数组P[10][10]： P代表二维数组首地址，*P代表 P[0][10]的地址，**P代表P[0][0]的值。  对于，一维数据P[10]； P代表一维数组首地址，*P代表P[0]的值。   其次，指针和数组，并不等价。并不是，把数组首地址，赋给指针后。指针就可以当，数组来用。  首选：  lian(shu); 传递给函数的参数，为二维数组的首地址。  然后： void lian(int *shu[8])，将二维数组的首地址（就是个地址值），转为一维数组首地址类型（一维的，指针数组）。  然后： 在 lian 函数中。 printf("shu point is %p\n", shu);  输出的为shu地址值，这个没什么问题，因为即使做了类型转换，首地址的值并没有变。  然后： 在lian函数中。 printf("shu point is %p\n", *shu)，输出的为shu[0]的值。此时，要去shu地址指向的地方，取其值，而这个值，就是1 。  所以，你用%p的方式，输出int型的1，自然为00000001。   补充： void lian(char **);  应该写错了吧，应该是void lian(int **); 而且，这版的代码，只能gcc，g++是编不过的。

user: user-2
content: 变量类型不一样，第一个打印时变量类型是**，第二个打印时变量类型是*

user: user-3
content: 程序写的类型相容没有警告是个好习惯，虽然能运行不可控那就白写了，建议先把类型转换加上~
user-0 提问: 做项目遇到个问题，就是图中Vref参考电压要变化，怎么用pic单片机I/O口控制R5悬空和接地来实现？感谢各位解答。

回复:
user: user-1
content: 引用 2 楼 qq_32339877的回复:引用 1 楼 user-4 的回复：你这个加个电容用PWM波就可以实现了吧关键没有pwm口 定时器输出到这个IO口，R3对地并一个电容滤波，改变定时器的周期比不就行了吗？

user: user-2
content: 单片机引脚配置为开漏，输出0时r5接地，输出1时r5相当于接高阻，近似断开。

user: user-3
content: R5和端口之间接一个二极管就可以了

user: user-0
content: 引用 1 楼 user-4 的回复：你这个加个电容用PWM波就可以实现了吧关键没有pwm口

user: user-4
content: 你这个加个电容用PWM波就可以实现了吧
user-0 提问: 《C标准库》里实现的clock应该错了吧？

回复:
user: user-1
content: 引用 15 楼 weixin_39158150 的回复:老哥，这个只是功能介绍，没有实现的代码啊。它完全可以用各种方式实现比如winapi，它也没说是用time函数的返回值乘以一个值来得出的呀（个人怎么想都觉得秒*数的方式实现不了） 要搞清楚因果关系。并不是clock返回秒乘以一个数，而是计算机计时的时候是按clock计数，返回的秒实际上是clock除以一个频率。 以前dos下用18.2就是因为早期的pc机有个18.2Hz的硬件时钟， 计算机好像有个硬件中断就是以这个频率在一直计数，clock在这个机器上实际就是读取这个计数器的数据，计算机计时需要对这个计数进行除18.2的处理，就是说每有18.2个脉冲过来秒数加1。 后来的计算机速度提高，计时的精度也提高了，所以clock也就被调高了吧

user: user-0
content: 引用 13 楼 Slzde_sub 的回复:[quote=引用 12 楼 weixin_39158150 的回复:] [quote=引用 11 楼 Slzde_sub 的回复:]    没必要扯这么多  去msdn上看看函数定义  函数返回值  函数说明  函数示例   那里是最标准的  请问在msdn里怎么找在里面迷路了都[/quote]   https://msdn.microsoft.com/zh-cn/library/4e2ess30.aspx   有能力尽量看英文原版[/quote]  老哥，这个只是功能介绍，没有实现的代码啊。它完全可以用各种方式实现比如winapi，它也没说是用time函数的返回值乘以一个值来得出的呀（个人怎么想都觉得秒*数的方式实现不了）

user: user-0
content: 引用 11 楼 Slzde_sub 的回复:   没必要扯这么多  去msdn上看看函数定义  函数返回值  函数说明  函数示例   那里是最标准的  请问在msdn里怎么找在里面迷路了都

user: user-1
content: CLOCKS_PER_SEC依赖于操作系统以及编译器，也就是说不同的环境下可能是不一样的 当然你如果确定自己只用某一个具体的环境，那就可以把它当成一个固定的值 如果想规范，就需要处理CLOCKS_PER_SEC

user: user-2
content: 你的这个clock()函数算的是从1900年到现在的时间吧？ 正如楼上所说，clock()函数返回的并不是毫秒。MSDN上的解释是 The elapsed time since the CRT initialization at the start of the process, measured in CLOCKS_PER_SEC units per second.  clock()函数返回的是进程开始时CRT初始化所消耗的时间，以每秒的 CLOCKS_PER_SEC 来测量。 也就是说，clock()函数返回值是秒× CLOCKS_PER_SEC 。CLOCKS_PER_SEC并不是一个固定值。

user: user-1
content: clock返回的是启动的秒数乘以CLOCKS_PER_SEC CLOCKS_PER_SEC依赖于操作系统以及编译器，并没有规定死是多少 vc6定义的是1000，这样clock返回就是毫秒 linux下定义的是1000000，对应clock是微秒 以前的dos下tubro c2.0定义CLOCKS_PER_SEC是18.2 以上这些都是可以的，并没有违规 所以你这书上直接返回秒也是可以的，这时候CLOCKS_PER_SEC=1

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！ 赵老师，您这段话怕是写在桌面随时复制粘贴吧？

user: user-0
content: 引用 4 楼 hou09tian 的回复:你的这个clock()函数算的是从1900年到现在的时间吧？ 正如楼上所说，clock()函数返回的并不是毫秒。MSDN上的解释是 The elapsed time since the CRT initialization at the start of the process, measured in CLOCKS_PER_SEC units per second.  clock()函数返回的是进程开始时CRT初始化所消耗的时间，以每秒的 CLOCKS_PER_SEC 来测量。 也就是说，clock()函数返回值是秒× CLOCKS_PER_SEC 。CLOCKS_PER_SEC并不是一个固定值。  这样相乘很怪吧，乘起来都是整千整千的，实际使用起来不是这样的啊，实际真的能精确到毫秒啊。

user: user-0
content: 引用 3 楼 ckc 的回复:clock返回的是启动的秒数乘以CLOCKS_PER_SEC CLOCKS_PER_SEC依赖于操作系统以及编译器，并没有规定死是多少 vc6定义的是1000，这样clock返回就是毫秒 linux下定义的是1000000，对应clock是微秒 以前的dos下tubro c2.0定义CLOCKS_PER_SEC是18.2 以上这些都是可以的，并没有违规 所以你这书上直接返回秒也是可以的，这时候CLOCKS_PER_SEC=1这样相乘很怪吧，乘起来都是整千整千的，实际使用起来不是这样的啊，实际真的能精确到毫秒啊。

user: user-3
content: RETURN VALUE        The  value  returned  is  the CPU time used so far as a clock_t; to get the number of seconds used, divide by CLOCKS_PER_SEC.  If the processor time used is not available or its        value cannot be represented, the function returns the value (clock_t) -1.  没毛病。

user: user-4
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！
user-0 提问: 关于链表操作中free函数的问题

回复:
user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-2
content: node * cj2(node *list, 	node * 	listt) { //思路：在第一个链表中将两个链表中的共同元素去掉，但是每次调用del_num时,free函数会出错 	node *list1 = list; 	for (; list != NULL; list = list->next) {//这里有逻辑问题，list1和list指向的是同一副本，而后续的del_num会操作list指向的副本，导致list变成脏数据，而c语言for循环的特性第三个表达式是本次循环结束后执行的，如果很不幸list指向的首元素刚好被free，在查找它的next时就会发生pe错误，一个低效的改进写法见后面 		if (sea_num(listt, list->value) != NULL) 			list1 = del_num(list1, list->value); 	} 	return list1; }  改进后 node * cj2(node *list, 	node * 	listt) { //思路：在第一个链表中将两个链表中的共同元素去掉，但是每次调用del_num时,free函数会出错 	node *list1 = list; 	for (; list != NULL; list = list->next) { 		if (sea_num(listt, list->value) != NULL) { 			list1 = del_num(list1, list->value); 			list = list1; 		} 	} 	return list1; }

user: user-0
content: 引用 1 楼 mscf 的回复:node * cj2(node *list, 	node * 	listt) { //思路：在第一个链表中将两个链表中的共同元素去掉，但是每次调用del_num时,free函数会出错 	node *list1 = list; 	for (; list != NULL; list = list->next) {//这里有逻辑问题，list1和list指向的是同一副本，而后续的del_num会操作list指向的副本，导致list变成脏数据，而c语言for循环的特性第三个表达式是本次循环结束后执行的，如果很不幸list指向的首元素刚好被free，在查找它的next时就会发生pe错误，一个低效的改进写法见后面 		if (sea_num(listt, list->value) != NULL) 			list1 = del_num(list1, list->value); 	} 	return list1; }  改进后 node * cj2(node *list, 	node * 	listt) { //思路：在第一个链表中将两个链表中的共同元素去掉，但是每次调用del_num时,free函数会出错 	node *list1 = list; 	for (; list != NULL; list = list->next) { 		if (sea_num(listt, list->value) != NULL) { 			list1 = del_num(list1, list->value); 			list = list1; 		} 	} 	return list1; } 多谢您的指点，我以后会注意逻辑问题的
user-0 提问: 中缀表达式转后缀表达式

回复:
user: user-1
content: 中缀表达式（如：-A+B-C+D)，求后缀表达式，遇到负数，可以这么处理。 第一种： 遇到“-”时，先判断是负号还是减号： 1. 如果上一个符号是 “（”，那么是负号。 2. 如果上一个符号是“）”，那么是减号。 3. 如果是表达式的第一个符号，那么是负号。 4. 如果上一符号是运算符，那么是负号。 5. 如果上一个符号是数字，那么是减号。  判断后，如果是负号，则连同后面的数字，一并当成数字处理。 特殊情况  -(-A) + B，如果“-”是第一个符号，并且后面是"("，则需要追加处理，继续重复上面的处理。如之前那种情况，最后判断为A（正） 如果是减号，则当成符号处理。  第二种： 这种比较简单啦，像第一种一样判断，是负号还是减号。如果是负号，先插入一个数字0，然后把该负号当成”减号“一样处理即可。   之后，延用后缀表达式的常规求法（这块资料很多了）。

user: user-0
content: 引用 2 楼 a3192048的回复:后缀为：A-B+C-D+ 1）如果遇到数字，我们就直接将其输出。  2）如果遇到操作符，则我们将其放入到栈中，遇到左括号时我们也将其放入栈中。  3）如果遇到一个右括号，则将栈元素弹出，将弹出的操作符输出直到遇到左括号为止。注意，左括号只弹出并不输出。  4）如果遇到任何其他的操作符，如（“+”， “*”，“（”）等，从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后，才将遇到的操作符压入到栈中。有一点需要注意，只有在遇到" ) "的情况下我们才弹出" ( "，其他情况我们都不会弹出" ( "。  5）如果我们读到了输入的末尾，则将栈中所有元素依次弹出。 能细说一下这题关于手工算法的步骤吗

user: user-2
content: 后缀为：A-B+C-D+ 1）如果遇到数字，我们就直接将其输出。  2）如果遇到操作符，则我们将其放入到栈中，遇到左括号时我们也将其放入栈中。  3）如果遇到一个右括号，则将栈元素弹出，将弹出的操作符输出直到遇到左括号为止。注意，左括号只弹出并不输出。  4）如果遇到任何其他的操作符，如（“+”， “*”，“（”）等，从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后，才将遇到的操作符压入到栈中。有一点需要注意，只有在遇到" ) "的情况下我们才弹出" ( "，其他情况我们都不会弹出" ( "。  5）如果我们读到了输入的末尾，则将栈中所有元素依次弹出。

user: user-3
content: 为什么要处理负号，他还是个数啊！
user-0 提问: 陈越姥姥的数据结构试验指导案例2-3疑问

回复:
user: user-1
content: #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

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

user: user-2
content: 不怎么用VS编程，对*_s系列函数不熟，于是我改为原版的scanf, sprintf，运行正常（我指的是没有出错，不过结果估计不是你想要的），代码如下 #include<stdio.h> #include<string.h>  #define MAXN 30 #define MAXSTRING 64  int count; void search(int remainder, int start, char *sTerms);  main() {     char sTerms[MAXSTRING]="";     int n;      scanf("%d", &n);     sprintf(sTerms, "%d=", n);     search(n, 1, sTerms);     if (count % 4 != 0)         printf("\n"); }  void search(int remainder, int start, char *sTerms) {     char sTmp[MAXSTRING];     strcpy(sTmp, sTerms);     for (int i = start; i <= remainder; i++) {         if (remainder - i >= i) {             printf("%d\n", strlen(sTerms));             sprintf(sTmp + strlen(sTerms), "%d+", i);             search(remainder - i, i, sTmp);         }         else {             printf("%d\n", strlen(sTerms));             sprintf(sTmp + strlen(sTerms), "%d", i);             count++;             if (count % 4 != 1)                 printf(";");             printf("%s", sTmp);             if (count % 4 == 0)                 printf("\n");             return;         }     } } 所以我估计问题出在微软的应该是sprintf_s这个函数。在debug时，问题是出现在search函数返回时，我估计是跟你的sprintf_s写法有关，参考一下以下几个百度百科的例子 j = sprintf_s( buffer, 200, " String: %s\n", s ); j += sprintf_s( buffer + j, 200 - j, " Character: %c\n", c ); j += sprintf_s( buffer + j, 200 - j, " Integer: %d\n", i ); j += sprintf_s( buffer + j, 200 - j, " Real: %f\n", fp ); 你就会猜到 sprintf_s(sTmp + strlen(sTerms), MAXSTRING, "%d", i); 这种拷贝的方法，使得sTmp[MAXSTRING]总共长度为MAXSTRING（64）的字符数组，在拷贝的过程中长度变成了MAXSTRING+strlen(sTerms)，肯定越界，不知道是不是search函数调用结束，临时变量sTmp[MAXSTRING]在销毁时，系统发现其越界，所以报错？总之，我的意思是，你把sprintf_s(sTmp + strlen(sTerms), MAXSTRING, "%d+", i);对应的都修改为 sprintf_s(sTmp + strlen(sTerms), MAXSTRING-strlen(sTerms), "%d+", i);保持sTmp 的总长度为MAXSTRING，则程序就能正常运行了。

user: user-3
content: 其实算起来程序本身没有问题，数据溢出，算是外在因素导致的。上面说的

user: user-2
content: 不过MAXSTRING定义了64确实是有点小，如果我输入的值超过30，例如，31就又挂了。  另外 	sprintf_s(sTerms, 3, "%d=", n);这里3也小了，只能输入10以内的数（因为算上'\0'，刚好3位），所以如果输入的数字超过10，这里也要相应调整，如果是两位数的话，这里就至少应该是4，三位数则至少应该是5，以此类推。
user-0 提问: 关于数学建模

回复:
user: user-1
content: 人民币一个亿怎么赚？

user: user-2
content: 你所说的边界值指的是什么？温度高低的极限值吗？说一下具体的需求吧

user: user-3
content: 条件有些欠缺

user: user-4
content: 这个没有上下文，很难说啊。
user-0 提问: 求该算法题的C语言编程，大佬帮帮忙，写不下去了，要能运行的

回复:
user: user-1
content: 先扫描一次，将数据转换成连续D或者连续A的个数： DADDA -> 1121 然后依次从每个点计算最大连续串数 a0：1+1+2=4 a1：1+1=2 a2：2+1=3 a3：1   AAADDAADADA  2 —> 3221111 a0：3+2+2=7 a1：2+2+1=5 a2：2+1+1+1+1=6 a3：1+1+1+1=4 a4：1+1+1=3 a5：1+1=2 a6：1

user: user-2
content: 是最大连续子序列问题。 A D可以简化成 把两种怪物理解为 1  -1 ，改变怪兽的状态可以理解为 初始值或者补偿值。  所以就是 求  1，-1，1，1    中加上初始值（查A为正值 查D为负值）的最大值或者最小值。  核心思想就是 当统计和从负到正 或者从正到负【楼上所说的翻转】，则证明之前统计的和可以舍弃。

user: user-0
content: 嗯嗯，还不是太懂。。。。。

user: user-3
content: 整个算法思想和过程如下：  选取连续的一个序列，当A或者B中一方个数较小=M，那么就暂停。 这种情况，只要反转较小数量的一方那么它们必定是连续相同的。 在此基础上，还需要判断第一个后续是否符合要变的，如果是那么就把它归到序列中，以此类推，直到不符合时停止。 ， 举例 DADDAAD，仅有反转1次。 第一步选取连续的串变为：DADDAAD 第二步，判断第一后续即DAD，D 因为选取的序列中A和D数量相同，不管反转哪一方，都可以，那我就把D归到序列中。但是此刻D较多，即为反转后的一方 继续前进DADD，D满足反转后一方，那么归到序列中 继续前进DADDA，A不符合，停止。  最终序列为DADD，4个数。  下一次循环，从索引1开始检查……直到选取的序列未索引能到达整个序列的末尾  引用 2 楼 hehuiui 的回复:你好，那个你是如何判断M的，就是要修改几个。

user: user-4
content: 看起来像是求最大连续子数列的问题

user: user-0
content: 你好，那个你是如何判断M的，就是要修改几个。

user: user-3
content: 仅供参考 #include <stdio.h> #include <string.h>  int main() {     int N = 0, M = 0;     char buf[1024] = { 0 };     int len;     int maxHP = 0;     int start = 0, end;     int DN = 0, AN = 0;     int tmp;      scanf("%d", &N);     scanf("%d", &M);     if (N < M)     {         printf("Input error.\n");         return 0;     }      scanf("%s", buf);     len = strlen(buf);      if (len != N)     {         printf("Input error.\n");         return 0;     }      tmp = 0;     while (tmp < len)     {         if (buf[tmp] != 'D' && buf[tmp] != 'A')         {             printf("Input error.\n");             return 0;         }         ++tmp;     }      while (start < len)     {         end = start;          DN = 0, AN = 0;         for (; end < len; ++end)         {             if (buf[end] == 'D')                 ++DN; // 统计D个数             else                 ++AN; // 统计A个数             if ((DN > AN ? AN : DN) == M) // 如果连续串中D和A个数最小等于M，那么立即停止                 break;         }          if (DN < AN) // 反转D->A的情况         {             tmp = 'A';         }         else if (DN > AN) // 反转A->D的情况         {             tmp = 'D';         }         else // DN == AN，随便反转的情况         {             tmp = 0;         }          // 统计更后续的字符是否符合情况         while (++end < len)         {             if (tmp == 0 || tmp == buf[end])             {                 tmp = buf[end];             }             else             {                 break;             }         }          if (end - start > maxHP) // 此串更长，更新最大HP值         {             maxHP = end - start;         }          // 如果end已经能查找到最后，终止轮询。（继续轮询无意义，因为查找的值将不可能大于maxHP）         if (end >= len)         {             break;         }          ++start;     }      printf("%d\n", maxHP);      return 0; }
user-0 提问: 为什么很多自定义的类型，还要用typedef定义一个 _t的类型别名

回复:
user: user-1
content: 原来声明时、需要写struct关键字。现在不需要了。当成class用就可以了。

user: user-2
content: 在之前的c版本中， 定义一个结构体 struct sender 之后，使用的时候 必须要写上 struct sender m_sender，为了简洁易懂，就使用typedef struct sender sender_t; 给他一个别名，用的时候 直接sender_t m_sender就可以了，现在c++中，哪怕你不定义别名，不写struct也可以了，在一个，定义成自己喜欢用起来方便的名字，省很多力气
user-0 提问: for循环初始化无效

回复:
user: user-1
content: 我调试了下你的代码，你说的奇怪的数字，其实是临时变量kk被声明之后，尚未初始化时从内存中读取的乱码，其后kk就被初始化为0了，但是你的for循环中                             for(int kk=0;kk<c;kk++){                                 arr[i][kk]==0;                             } arr[i][kk]==0;不是赋值，而是比较。结果程序在编译的过程中做了优化，arr[i][kk]==0;这句就优化没了（具体你可以看下汇编代码），所以for循环没有执行体，就直接运行完了，然后就执行后面的代码去了。 你把arr[i][kk]==0;改成arr[i][kk]=0;就可以正常调试了。 你的函数第82行也有这个问题                             for(int j=0;j<r;j++){                                 arr[j][i]==0;                             }
user-0 提问: 根据数组顺序进行排序。

回复:
user: user-0
content: 基本就是这个意思。这样就有思路了，谢谢了，请问C语言怎么学那，怎么有自己的思维方式。

user: user-1
content: 你的意思是这样？ #include<stdio.h> #include<stdlib.h> #include<string.h>  #define MAX_SIZE 100  char buf[MAX_SIZE];  char ttime[] = "23:00"; char tdate[] = "2018-09-14"; char tweek[] = "FRIDAY";  int order1[3] = {2,3,1}; int order2[3] = {3,1};  void test(int *ord) {     int i;     for(i = 0; i < 3; i++)     {         switch(ord[i]){         case 1:             strcat(buf,tdate);strcat(buf," ");break;         case 2:             strcat(buf,ttime);strcat(buf," ");break;         case 3:             strcat(buf,tweek);strcat(buf," ");break;         default:break;         }     } }   int main() {     memset(buf,0,sizeof(buf));     test(order1);     printf("%s\n",buf);     memset(buf,0,sizeof(buf));     test(order2);     printf("%s\n",buf);     return 0; }

user: user-0
content: 是这个意思，我需要根据order[3]中的顺序对三个字符进行排序，假如order[3] = {3, 1, 2},顺序则是星期  日期 时间， order[3] = {2, 1};则是时间 日期，星期不显示；（为0代表不显示），就是这样的； 还要调用sprintf打印出来； 一个项目中的一个小的需求。
user-0 提问: 关于C语言中作用域的问题，在看openpilot源码的时候对一处作用域的用法不理解

回复:
user: user-1
content: 建议不要这样去看复杂宏展开。用gcc -E main.c来看宏展开的结果，并对结果格式化（就是排排整齐），这样会比较好理解些。  一般来说，如果代码中有*()，那么()中差不多就是个指针类型，而*就是解引用。

user: user-2
content: 参考http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html#Statement-Exprs 好像是返回语句块中最后语句的返回值，你这应该是对&(((type##Array *)dummy)->array); 进行解地址操作吧。
user-0 提问: 初学者不明白这个若干行的意思

回复:
user: user-1
content: 正如2楼所说，用while()语句判断输入流的流状态位。 输入输出流定义了4个标志位来测试流的状态，badbit、eofbit、failbit和goodbit。其中，badbit位表示了在流缓冲区中发生了致命性错误，流将不能继续使用；eofbit位表示输入结束，例如按下了Ctrl-Z；failbit位表示I/O操作由于非法数据而失败，流可以继续使用；goodbit位表示一切正常，没有错误发生，也没有发生输入结束。 while(!cin.eofbit){ } 请参考《C++中输入流istream》 希望能够帮到你

user: user-2
content: 引用 13 楼 SUNT2018的回复:一行两数，算加减乘除，求出运算结果四个数中不超过100的最大数。 有n行，就算到n行，若干行就是n。

user: user-2
content: 一行两数，算加减乘除，求出运算结果四个数中不超过100的最大数。

user: user-3
content: 样例的判断应该是只要所有的输入都对应有输出，并且输出正确，就能通过

user: user-4
content: 输入若干行的意思可以分开来理解，“输入”，“若干”，“行” 输入就不用说了，那“若干”可以理解为“人为自定义多少”，就是说不确定，是多是少由自己决定。 那“行”就不用说了吧。 总的来说就是“想输入多少行由你自己决定，可以输入一行，也可以输入无数行（前提你要有精力）”。

user: user-5
content: 标题已经说了，他们的值不能超过100，楼主可以多增加一些行数。

user: user-0
content: 引用 1 楼 user-10 的回复：贴一下你的代码吧，不然也没办法帮你看你的问题出在哪里，对吧。 而且，我觉得如果你的代码跑这个样例输入，结果跟这个样例输出一样的话，应该不会有啥问题呀。2楼是正解，不这样写的话会一直提示格式错误之类的

user: user-0
content: 引用 2 楼 Slzde_sub 的回复：while（std::cin>>n>>m） { }  或者  while(scanf("%d%d",&n,&m)) { }  这就是若干行谢谢，这是正解

user: user-6
content: 若干行就是 针对每个输入的一行都输出一行

user: user-7
content: 若干行，就是多个测试用例。若干是一个大概的意思，一般输入3～5行就差不多。如果想测试的更充分，可以考虑多数入一些行数

user: user-8
content: 文字描述的很清楚，求和 差 积不超过100的最大值。

user: user-9
content: 行数不确定。

user: user-10
content: 贴一下你的代码吧，不然也没办法帮你看你的问题出在哪里，对吧。 而且，我觉得如果你的代码跑这个样例输入，结果跟这个样例输出一样的话，应该不会有啥问题呀。
user-0 提问: gcc version 5.1.0 (tdm-1)(32bit) 不能内联 SSE 指令集汇编？

回复:
user: user-1
content: 《The Intel 64 and IA-32 Architectures Software Developer's Manual》

user: user-1
content: The _emit Pseudoinstruction Home |  Overview |  How Do I  The _emit pseudoinstruction is similar to the DB directive of MASM. You use _emit to define a single immediate byte at the current location in the current text segment. However, _emit can define only one byte at a time, and it can only define bytes in the text segment. It uses the same syntax as the INT instruction.   The following fragment places the given bytes into the code:  #define randasm __asm _emit 0x4A __asm _emit 0x43 __asm _emit 0x4B  .  .  . __asm {      randasm      } 不知道gcc汇编有没有类似关键字。

user: user-2
content: #include <intrin.h>  __m128i a, b;    __asm(     "movdqa %0,%%xmm0\n\t"     "por %1,%%xmm0\n\t"     "movdqa %%xmm0,%0\n\t"     :     :"m"(a), "m"(b)   );
user-0 提问: C语言 字符串赋值为题

回复:
user: user-1
content: https://ask.csdn.net/questions/699817 你不是问过了么

user: user-2
content: char *bpArrayDat="$$$$$$$$$$$$$$$$"; 因为bpArrayDat是指针，指向的内存位置是只读的。因此不能赋值（修改）。  建议通过malloc/free或new/delete来申请空间就可以赋值了。

user: user-3
content: 首先从程序上来说，这两段代码都是不对的， 第一段代码，你说结果是对的，这个是概率发生的，因为你返回了临时变量的地址bArrayDat，很有可能造成崩溃  第二段代码，bpArrayDat指向了一块常量区，并没有分配空间，修改结果也是未定义的，所以也是不正确的做法  正确的做法，自己分配空间，返回后注意free  比如改成char *bpArrayDat = (char*)malloc(1024); 函数返回使用后记得free，其实这样也不太好，需要知道申请了1024大小的空间， 最好是在外边就申请好空间，然后将作为参数传入函数

user: user-4
content: 其实 本来char* pStr = “hello” 这样的赋值在C++是不允许的，之所以可以，是c++为了兼容c而改变的，所以，即便这样可以，也要养成 const char* pStr=“hello” 这样的好习惯

user: user-0
content: 二楼说的有道理，主要原因是一个是字符串常量，一个是字符串变量，所以一个能行，一个不能行！

user: user-0
content: 在一个双引号""内的字符序列或者转义字符序列称为字符串常量  例如："HA HA！"  "abc"  "\n\t"  这些字符串常量是不能改变的，如果试图改变指针所指向的内容是错误的  因为字符串常量是存在静态内存区的，不可以改变的。  如定义字符串常量：  char* a="i love you.";  a[3]='p'(非法操作)。  因为a[3]本来就是一个常量，常量不能被改变。（比如 1=2一样）  如定义字符串变量：   char a[]="i love you.";   a[3]=‘p’是可以的.  因为这个a[3]不同于上例中的 这个是一个 char 类型的变量 。  但是字符指针变量指向是可以改变的。  如：char *a="I love my china"          char *a="I am student"  这个是可以的
user-0 提问: Linux平台read-recv-select 84错误-84 EILSEQ

回复:
user: user-1
content: 字节序错误。 严格使用hton系列函数调整字节序。

user: user-0
content: 通过了解应该是其他打印格式出错造成，但是超时应该会被重置才对。
user-0 提问: CFree调试，怎样显示数组全体成员？

回复:
user: user-1
content: 先放答案：在watch窗口中添加'a,7'，参见https://stackoverflow.com/questions/972511/view-array-in-visual-studio-debugger和https://docs.microsoft.com/en-us/visualstudio/debugger/format-specifiers-in-cpp?view=vs-2015。哦对了，这是VC不是CFree，但印象中CFree是VC的皮？记不清楚了。另外这只是个小技巧，能不能自动完成就不确定了。  另外说说LZ免谈的东西，先是printf，如果LZ有工作，就知道如果有人给你写个printf会多有用了（其实是指log）。再是memory，某些山穷水尽的时候（比如没有log），那么memory可能就是不得不看的东西。

user: user-0
content: 引用 5 楼 qq_39850605 的回复:你想调试的时候看，可以整个全局变量，或者静态局部变量。 为调试，改动程序较大。调试结束后，还得改回来。

user: user-2
content: 在子函数里，形参就是子函数内的变量。而实参传递到子函数内的是地址，因此在子函数里就需要用形参名来访问实参a。

user: user-3
content: 函数内已经不是数组了，而是指针int *，并没有记录它的长度。 调试时候可以加个打印函数，比如MyPrintf(int *a, int num);

user: user-4
content: 数组自动降级为指针

user: user-5
content: 你想调试的时候看，可以整个全局变量，或者静态局部变量。

user: user-6
content: 那免谈

user: user-0
content: 引用 1 楼 jianwen0529 的回复:函数内已经不是数组了，而是指针int *，并没有记录它的长度。 调试时候可以加个打印函数，比如MyPrintf(int *a, int num);  想用debug方式，不太printf 函数操作源数组，只能指针/别名方式。不能视为自己的变量，调试时，显示比较麻烦。
user-0 提问:  GetMemory(str);为什么不是传地址

回复:
user: user-1
content: 引用 3 楼 XN6666 的回复:我就是搞不清楚为什么非得这么写才行，感觉直接传str也可以啊 你的void GetMemory(char* p) 函数的参数p是一个字符指针变量，那你调用GetMemory(str)；传入的参数是str，但到了调用函数GetMemory内部，实际上却是str的拷贝str'，你在函数中做的任何操作，只影响了str'，但是对str本身是没有任何影响的。 用下面简单的代码做个比较： 调用Get_Add不会改变变量a的值，一个道理，因为传入Get_Add函数的参数，只是a的一份拷贝a'，变量a和a'的值相同，但是在内存中的物理地址不同。所以调用函数的结果只是改变a'的值，但是a是不会改变的，因为a'和a本来就是存在不同物理地址的两个变量。 调用Get_Add_2就不一样了，本身Get_Add_2的参数就是一个整型指针，这时你调用Get_Add_2(&a)，虽然传入的也只是&a的拷贝&a'，但是，&a和&a'的值都是变量a的物理地址，那么通过&a‘对这个物理地址进行的操作，就相当于通过&a在对变量a进行操作，当然也就改变了变量a的值#include<stdio.h>  void Get_Add(int x) {     x++;     printf("x = %d now\n",x); }  void Get_Add_2(int *x) {     (*x)++;     printf("*x = %d now\n",*x); }   int main() {     int a = 1;     Get_Add(a);     printf("after calling Get_Add, a = %d now\n",a);          //     Get_Add_2(&a);     printf("after calling Get_Add_2, a = %d now\n",a);      return 0; }

user: user-2
content: 指针是一种地址变量，既然是变量，想要改变变量的值，就得先知道变量的地址。所以要改变指针的指向，只能把指针的地址传进去，否则改变的只是形参p的指向，而不是实参str

user: user-3
content: 直接传str传入的是指针变量的值， 是一个副本， 不是原指针变量本身， 也不是原指针变量本身的地址

user: user-4
content: 调用GetMemory(str)；时传入参数str，str是一个变量啊，传入后就变成了p，如果str一开始指向有效空间，现在改变p指向的内容是可以的，但是此时p指向的内存是无效的，然后又用了malloc，p指向了一个新的地方，但是这样无法改变str 想改变str，就必须传入str的地址，需要函数参数为char**才可以

user: user-0
content: 我就是搞不清楚为什么非得这么写才行，感觉直接传str也可以啊

user: user-0
content: void GetMemory(char** p)  {  * p = (char *)malloc(100); } int main(void)  {      char *str = NULL;     GetMemory(&str);     strcpy(str, "hello");      printf(str);  }

user: user-5
content: 这个程序是有问题的。GetMemory传入str后不能获取到申请到的空间首地址，会导致内存泄露。  这个程序运行应该会遇到段错误。因为将"hello"拷贝加NULL开头的内存里。  你的问题没传地址，str也是地址呢
user-0 提问: 不太会做这道所谓简单的题，能帮忙解答一下需要详细步骤

回复:
user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-2
content: 根据C语言运算符优先级，题目中的涉及到的优先级从高到低为~，>>，^。那么 ~(10>>1^~5) = ~(10>>1 ^(~5)) = ~((10>>1)^-6) = ~(5^-6) = ~(-1) = 0

user: user-3
content: 应该是0吧，考察应该是优先级，其中异或^的优先级最低 那就分成10>>1和~5两部分，也就是5^(~5)，应该是0吧

user: user-4
content: ~位求反 >>向右移位 ^位异或 而这三个运算符的优先级是“位求反~”>“向右移位>>”> “位异或^” 因此，~（10>>1^~5)等效为 “~(（10>>1) ^ (~5) )” 最后结果为0
user-0 提问: 关于PE相关代码的问题

回复:
user: user-1
content: 严格区分32/64位了吗？

user: user-0
content: 引用 1 楼 demoo11的回复:newpSectionHeader->SizeOfRawData =	newpSectionHeader->Misc.VirtualSize=BEISHU*pOptionHeader->SectionAlignment;	(newpSectionHeader-1)->SizeOfRawData > (newpSectionHeader-1)->Misc.VirtualSize? X = (newpSectionHeader-1)->SizeOfRawData :X = (newpSectionHeader-1)->Misc.VirtualSize;	newpSectionHeader->VirtualAddress=	(newpSectionHeader-1)->VirtualAddress+X;	newpSectionHeader->PointerToRawData = (newpSectionHeader-1)->PointerToRawData+(newpSectionHeader-1)->SizeOfRawData;	newpSectionHeader->Characteristics = pSectionHeader->Characteristics; 相关代码，手机复制的，导致排版变形了

user: user-0
content: newpSectionHeader->SizeOfRawData =	newpSectionHeader->Misc.VirtualSize=BEISHU*pOptionHeader->SectionAlignment;	(newpSectionHeader-1)->SizeOfRawData > (newpSectionHeader-1)->Misc.VirtualSize? X = (newpSectionHeader-1)->SizeOfRawData :X = (newpSectionHeader-1)->Misc.VirtualSize;	newpSectionHeader->VirtualAddress=	(newpSectionHeader-1)->VirtualAddress+X;	newpSectionHeader->PointerToRawData = (newpSectionHeader-1)->PointerToRawData+(newpSectionHeader-1)->SizeOfRawData;	newpSectionHeader->Characteristics = pSectionHeader->Characteristics;
user-0 提问: 【求助】sscanf高效率提取字符串内容求助

回复:
user: user-1
content: 引用 9 楼 teleinfor 的回复:[quote=引用 6 楼 DelphiGuy 的回复:] 常规汇编，和#2生成的代码几乎一样，用SSE/AVX，就这么几个字节的复制效率未必高... 我也不确定效率差异，我之前用的是memcpy内存复制。感觉和"="赋值操作是不是应该差不多？[/quote]  差远了，memcpy光调用的开销都比直接赋值大了，直接赋值比用memcpy、sscanf快几十倍到几百倍...

user: user-0
content: 引用 6 楼 DelphiGuy 的回复:常规汇编，和#2生成的代码几乎一样，用SSE/AVX，就这么几个字节的复制效率未必高... 我也不确定效率差异，我之前用的是memcpy内存复制。感觉和"="赋值操作是不是应该差不多？

user: user-0
content: 引用 10 楼 DelphiGuy 的回复:[quote=引用 9 楼 teleinfor 的回复:] [quote=引用 6 楼 DelphiGuy 的回复:] 常规汇编，和#2生成的代码几乎一样，用SSE/AVX，就这么几个字节的复制效率未必高... 我也不确定效率差异，我之前用的是memcpy内存复制。感觉和"="赋值操作是不是应该差不多？[/quote]  差远了，memcpy光调用的开销都比直接赋值大了，直接赋值比用memcpy、sscanf快几十倍到几百倍... [/quote] 好的，多谢。那我修改为直接这么赋值操作，回头测试下海量情况下的效率差异。

user: user-1
content: 这几条指令，profiler啥也分析不出来，要循环重复几百万次...

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

user: user-1
content: 常规汇编，和#2生成的代码几乎一样，用SSE/AVX，就这么几个字节的复制效率未必高...

user: user-2
content: 没人用嵌入汇编吗？

user: user-3
content: 效率就要自己测试下了  	char *p = "2018-07-02 03:40:13.090853929"; 	char str[128] = { 0 }; 	sscanf(p, "%4s-%2s-%2s %2s:%2s:%2s.%3s", str, &str[4], &str[6], &str[8], &str[10], &str[12], &str[14]);

user: user-0
content: 嗯，我试试看，谢谢。 引用 2 楼 DelphiGuy 的回复:要效率，可以直接复制，只是几条mov指令而已： inline void FilterDateTimeStr(const char *src, char *dest) {   *(int *)&dest[0] = *(int *)&src[0];   *(short *)&dest[4] = *(short *)&src[5];   *(short *)&dest[6] = *(short *)&src[8];   *(short *)&dest[8] = *(short *)&src[11];   *(short *)&dest[10] = *(short *)&src[14];   *(short *)&dest[12] = *(short *)&src[17];   *(short *)&dest[14] = *(short *)&src[20];   dest[16] = src[22];   dest[17] = 0; }

user: user-0
content: 引用 1 楼 user-3 的回复:效率就要自己测试下了  	char *p = "2018-07-02 03:40:13.090853929"; 	char str[128] = { 0 }; 	sscanf(p, "%4s-%2s-%2s %2s:%2s:%2s.%3s", str, &str[4], &str[6], &str[8], &str[10], &str[12], &str[14]);  嗯，多谢。我试试看吧。总归需要一些技巧吧。

user: user-1
content: 要效率，可以直接复制，只是几条mov指令而已： inline void FilterDateTimeStr(const char *src, char *dest) {   *(int *)&dest[0] = *(int *)&src[0];   *(short *)&dest[4] = *(short *)&src[5];   *(short *)&dest[6] = *(short *)&src[8];   *(short *)&dest[8] = *(short *)&src[11];   *(short *)&dest[10] = *(short *)&src[14];   *(short *)&dest[12] = *(short *)&src[17];   *(short *)&dest[14] = *(short *)&src[20];   dest[16] = src[22];   dest[17] = 0; }
user-0 提问: C  一个烫烫烫的问题

回复:
user: user-1
content: 加一个rewind(fp);或者fseek(fp, 0, SEEK_SET);

user: user-2
content: 引用 2 楼 zhangchm2018 的回复:[quote=引用 1 楼 zhangchm2018 的回复:] 因为 fprintf 和 fscanf 输入输出的只能是 char 类型的数据，所以它会将你输入的任意数据都转换成 char 类型的 如果你想输入和读取 int, float, double 之类的数据，推荐使用 fwrite 和 fread 函数 fread  http://www.runoob.com/cprogramming/c-function-fread.html fwrite http://www.runoob.com/cprogramming/c-function-fwrite.html比如 float 类型的 88，会转换成 '8' '8'[/quote]3L说的对，是我错了

user: user-3
content: 感觉3楼回答正确

user: user-4
content: 就你这个题目来说，是你的文件指针fp的位置问题引起的，如果要读取你刚刚写入student.txt里的那些数据，你需要把文件指针fp重新移到文件开头#include <stdio.h> #include <memory.h> #include<stdlib.h> struct student {     int num;     char name[10];     float score1;     float score2;     float score3;     float aver; }; main() {     int i,nu;     float sc1,sc2,sc3;     char na[10];     struct student st[1];     FILE *fp;     if((fp=fopen("E:\student.txt","w+"))==NULL)     {         printf("can not open file\n");         exit(0);     }     setbuf(fp,NULL);     for(i=0; i<1; i++)     {         scanf("%d%s%f%f%f",&nu,&na,&sc1,&sc2,&sc3);         fprintf(fp,"%d %s %f %f %f %f",nu,na,sc1,sc2,sc3,(sc1,sc2,sc3)/3);         fflush(fp);     }      fseek(fp,0L,SEEK_SET); // 定位文件读写指针fp到文件开头      for(i=0; i<1; i++)     {         fscanf(fp,"%d%s%f%f%f%f%f",&st[i].num,&st[i].name,&st[i].score1,&st[i].score2,&st[i].score3,&st[i].aver);     }     for(i=0; i<1; i++)     {         printf("%d %s %.2f %.2f %.2f %.2f",st[i].num,st[i].name,st[i].score1,st[i].score2,st[i].score3,st[i].aver);     }     fclose(fp); }

user: user-2
content: 引用 1 楼 zhangchm2018 的回复:因为 fprintf 和 fscanf 输入输出的只能是 char 类型的数据，所以它会将你输入的任意数据都转换成 char 类型的 如果你想输入和读取 int, float, double 之类的数据，推荐使用 fwrite 和 fread 函数 fread  http://www.runoob.com/cprogramming/c-function-fread.html fwrite http://www.runoob.com/cprogramming/c-function-fwrite.html比如 float 类型的 88，会转换成 '8' '8'

user: user-2
content: 因为 fprintf 和 fscanf 输入输出的只能是 char 类型的数据，所以它会将你输入的任意数据都转换成 char 类型的 如果你想输入和读取 int, float, double 之类的数据，推荐使用 fwrite 和 fread 函数 fread  http://www.runoob.com/cprogramming/c-function-fread.html fwrite http://www.runoob.com/cprogramming/c-function-fwrite.html
user-0 提问:  并非所有的代码路径都返回值

回复:
user: user-1
content: 错误提示写得很清楚了，网上随便一搜例子一大堆，不明白你的疑问是什么

user: user-2
content: 有没有返回值是看定义的。 如果没有返回值，那么函数怎么退出？（即使void类型函数，那么它也是有退出的路径的）

user: user-3
content: 最后加一个 return true 啊, 提示得这么明显了. 另外, 这里不是 C# 区哦
user-0 提问: c语言注意事项

回复:
user: user-1
content: 说的好，不如再贴出几个程序大家一起讨论一下，这样会更好～

user: user-2
content: 说的非常好！ 其实我是来接分的

user: user-3
content: 这是要接分的节奏么？

user: user-4
content: 想说明什么？

user: user-5
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  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",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的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   “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
user-0 提问: pdu超长短信编码

回复:
user: user-0
content: 前面数据的处理我都搞定了，就是后面拆分之后数据的处理还在考虑

user: user-1
content: 大体上是要多发一个udh的头 udh[10]="\x05\x00\x03" udh[3]=(char)(time(NULL)%255); udh[4]=(char)((cstrlen(nr)+66)/67); udh[5]=(char)j; udh头是6个字节，前3个固定，第4个是一个标识，表明是哪一条短信，第5个是总条数，第6个是第几条短信 单条短信每条可发70，长短信每条只能发67，在udh头后面跟这67的编码就可以了
user-0 提问: 用scanf输入的double类型的数据不对

回复:
user: user-1
content: 说实话    很同意楼上赵四老师的说法，编程真的很需要细心，==写成=，指针忘了释放，数组越界，嵌套的两个for循环搞成死循环了，变量拼错了，编程真的需要细心，编程真的需要细心！编程真的需要细心！

user: user-2
content: 这个问题好坑。真佩服那个能分辨出来1和l的兄弟

user: user-3
content: 1Il|│ 0oO○。°

user: user-3
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-4
content: 始于此，终于此。

user: user-5
content: 好久没见过VC6.0的界面了

user: user-0
content: 好的  谢谢了
user-0 提问: c语言问题 求大神解答

回复:
user: user-1
content: 引用 3 楼 lijingswjtu的回复:  #include<stdio.h> void main() { 	int a,b,c,n,x,y,z,m=0; 	printf("请输入红球、白球和黑球个数。\n"); 	scanf("%d %d %d",&a,&b,&c); 	printf("请输入取出球的个数。\n");     scanf("%d",&n); 	if(n<=a+b+c)   //输入的n值不能超过球总数 	{     for(x=0;x<=a;x++)   //x为取红球个数 		for(y=0;y<=b;y++) //y为取白球个数 			for(z=0;z<=c;z++)  //z为取黑球个数 			{ 				if(n==x+y+z) 				{ 					printf("取出红球%d个，取出白球%d个，取出黑球%d个\n",x,y,z); 				    m++; 				} 			} 			printf("一共有%d种不同的颜色搭配。 ",m);  	} 	else 	{printf("取出球的个数超过球的总数，输入错误！");}  } 这是套了三层循环吗？凑十个字

user: user-2
content: #include<stdio.h> void main() { 	int a,b,c,n,x,y,z,m=0; 	printf("请输入红球、白球和黑球个数。\n"); 	scanf("%d %d %d",&a,&b,&c); 	printf("请输入取出球的个数。\n");     scanf("%d",&n); 	if(n<=a+b+c)   //输入的n值不能超过球总数 	{     for(x=0;x<=a;x++)   //x为取红球个数 		for(y=0;y<=b;y++) //y为取白球个数 			for(z=0;z<=c;z++)  //z为取黑球个数 			{ 				if(n==x+y+z) 				{ 					printf("取出红球%d个，取出白球%d个，取出黑球%d个\n",x,y,z); 				    m++; 				} 			} 			printf("一共有%d种不同的颜色搭配。 ",m);  	} 	else 	{printf("取出球的个数超过球的总数，输入错误！");}  }

user: user-3
content: 两个for循环不就搞定了？
user-0 提问: 这段代码sum的输出结果是-nan（ind）,为什么啊

回复:
user: user-1
content: 引用 4 楼 cfjtaishan 的回复:[quote=引用 1 楼 zhangchm2018 的回复:] #include<stdio.h> #include<math.h> int main() { double a[1000]; int i; int m; double sum; while (scanf("%lf", &a[0]) != EOF) { sum = a[0]; scanf("%d", &m); for (i = 0; i < m - 1; i++) { a[i + 1] = sqrt(a[i]); sum += a[i + 1]; }	 printf("%.2f\n", sum); sum = 0; } while (getchar() != '\n') 	continue; getchar(); return 0; } ① sum 初始化错误 ② scanf 的格式控制符使用错误，double 对应 %lf 根据标准，%f可以输入double类型的数据。输出时建议用%lf[/quote] 我用的 VS2012， 输入 double 类型 只能用 %lf 还有我学的书是 《C Primer Plus（第6版）》，书中说的也是 输入 double 用 %lf

user: user-2
content: 引用 1 楼 zhangchm2018 的回复:#include<stdio.h> #include<math.h> int main() { double a[1000]; int i; int m; double sum; while (scanf("%lf", &a[0]) != EOF) { sum = a[0]; scanf("%d", &m); for (i = 0; i < m - 1; i++) { a[i + 1] = sqrt(a[i]); sum += a[i + 1]; }	 printf("%.2f\n", sum); sum = 0; } while (getchar() != '\n') 	continue; getchar(); return 0; } ① sum 初始化错误 ② scanf 的格式控制符使用错误，double 对应 %lf 根据标准，%f可以输入double类型的数据。输出时建议用%lf

user: user-2
content: double sum = a[0]; 这句改成： double sum = 0.0; 因为a[0]是一个随机值，在没有输入数据之前，它是一个随机值。

user: user-3
content: 楼主，你那个system是什么？

user: user-1
content: #include<stdio.h> #include<math.h> int main() { double a[1000]; int i; int m; double sum; while (scanf("%lf", &a[0]) != EOF) { sum = a[0]; scanf("%d", &m); for (i = 0; i < m - 1; i++) { a[i + 1] = sqrt(a[i]); sum += a[i + 1]; }	 printf("%.2f\n", sum); sum = 0; } while (getchar() != '\n') 	continue; getchar(); return 0; } ① sum 初始化错误 ② scanf 的格式控制符使用错误，double 对应 %lf
user-0 提问: 如何每隔一秒，让已知量与时间之积进行累加？

回复:
user: user-1
content: 靜態局部變量+定時器+綫程 定時器每秒啓動綫程調用計算函數，函數中這個纍加值是靜態變量，把乘積類加上去。

user: user-2
content: 求y轴（电流），x轴（时间） 截取段面积？

user: user-3
content: 正如楼上所说，最好在子线程中进行计算。使用定时器，每隔一秒获取当前电流值，并对时间进行累加，最后得到电流值与时间的乘积，累加到一个局部变量中即可。
user-0 提问: C语言openMP调用核心数问题

回复:
user: user-1
content: openmp不能跨节点吧，试试MPI框架

user: user-2
content: 我也遇到同样问题了，四路AMD8365se，16x4共64核，Server2018，显示32核，64线程，用get_num_procs，得到32。运行程序时只有32核工作。不知道是操作系统的限制，还是硬件的问题，用的是intel parallel的openmp。

user: user-0
content: 回复三楼user-3 我也没有解决不能全部调用的问题，只能调用一路最大32核。 建议从程序算法改进着手，你的能够调用48核，改进一下算法一般地科学计算可能也够用了。我的就是改进算法后将计算效率提高到了可以接受的范围

user: user-3
content: 请问楼主问题解决了吗？我也碰到了类似的问题；  我的机器是：四路e7，共96核192线程。openMP程序中设置192核并行计算时，cpu只使用了25%（一路）;  以下是源代码： #include "stdafx.h" #include <iostream> #include <time.h> #include <omp.h> void test() {     int a = 0;     for(int i = 0;i < 100000000;i++)         a++; }  int _tmain(int argc, _TCHAR* argv[]) {     clock_t t1 = clock();     omp_set_num_threads(192);//设置192核并行计算     #pragma omp parallel for     for (int i=0;i<192;i++)         test();     clock_t t2 = clock();     std::cout<<"time: "<<t2-t1<<std::endl;     getchar();     return 0; }
user-0 提问: 算法笔记3.2问题C，一直显示答案错误，麻烦各位大神帮忙看看问题在哪！！感谢！！

回复:
user: user-1
content: 看你的代码觉得没啥问题呀，直到去codeup上看了这道题及其讨论，测试数据用的是中文(001 张三 男 19)，那你的sex用char肯定不行，而且题目也坑，看了看讨论，说id和name数组开得不够大，开到100就过了。 #include <stdio.h> #include <string.h> struct student {     char id[100];     char name[100];     char sex[10];     int age; } stu[1001]; int main() {     int n,m,flag;     char count[20];     while(scanf("%d",&n)!=EOF)     {         for(int i=0; i<n; i++)         {             scanf("%s %s %s %d",stu[i].id,stu[i].name,&stu[i].sex,&stu[i].age);         }         scanf("%d",&m);         for(int i=0; i<m; i++)         {             scanf("%s",count);             flag=0;             for(int j=0; j<n; j++)             {                 if(strcmp(count,stu[j].id)==0)                 {                     flag=1;                     printf("%s %s %s %d\n",stu[j].id,stu[j].name,stu[j].sex,stu[j].age);                     break;                 }             }             if(flag==0)             {                 printf("No Answer!\n");             }         }     }      return 0; }

user: user-2
content: 你是想录入学生的学号、名字、性别、年龄后，再按学号查询学生信息吗？

user: user-3
content: 题目是要干啥
user-0 提问: 想问一个如何在xml节点中添加父节点的问题，还请大神帮忙解答

回复:
user: user-1
content: //创建一个节点，设置节点内容和属性，然后加入根节点 xmlNodePtr pnode = xmlNewNode(NULL, BAD_CAST"node2"); xmlNodePtr content = xmlNewText(BAD_CAST"node2 Content"); xmlAddChild(pRootNode, pnode); xmlAddChild(pnode, content); //属性 xmlNewProp(pnode, BAD_CAST"attribute", BAD_CAST"yes");   //创建一个儿子和孙子节点 pnode = xmlNewNode(NULL, BAD_CAST"son"); xmlNewProp(pnode, BAD_CAST"attribute", BAD_CAST"age"); xmlAddChild(pRootNode, pnode);   xmlNodePtr pGrandson = xmlNewNode(NULL, BAD_CAST"grandson"); xmlAddChild(pnode, pGrandson); xmlAddChild(pGrandson, xmlNewText(BAD_CAST"grandson content"));
user-0 提问: Misra C 2012 +PC Lint的一个问题

回复:
user: user-1
content: PWM->CTRL = (uint8)0x21; 试试看。

user: user-1
content: C++ Integer Constants Integer constants are constant data elements that have no fractional parts or exponents. They always begin with a digit. You can specify integer constants in decimal, octal, or hexadecimal form. They can specify signed or unsigned types and long or short types.  Syntax  integer-constant :  decimal-constant integer-suffixopt octal-constant integer-suffixopt hexadecimal-constant integer-suffixopt 'c-char-sequence'  decimal-constant :  nonzero-digit decimal-constant digit  octal-constant :  0 octal-constant octal-digit  hexadecimal-constant :  0x hexadecimal-digit 0X hexadecimal-digit hexadecimal-constant hexadecimal-digit  nonzero-digit : one of  1 2 3 4 5 6 7 8 9  octal-digit : one of  0 1 2 3 4 5 6 7  hexadecimal-digit : one of  0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F  integer-suffix :  unsigned-suffix long-suffixopt long-suffix unsigned-suffixopt  unsigned-suffix : one of  u U  long-suffix : one of  l L  64-bit integer-suffix :  i64  To specify integer constants using octal or hexadecimal notation, use a prefix that denotes the base. To specify an integer constant of a given integral type, use a suffix that denotes the type.  To specify a decimal constant, begin the specification with a nonzero digit. For example:  int i = 157;   // Decimal constant int j = 0198;  // Not a decimal number; erroneous octal constant int k = 0365;  // Leading zero specifies octal constant, not decimal  To specify an octal constant, begin the specification with 0, followed by a sequence of digits in the range 0 through 7. The digits 8 and 9 are errors in specifying an octal constant. For example:  int i = 0377;   // Octal constant int j = 0397;   // Error: 9 is not an octal digit  To specify a hexadecimal constant, begin the specification with 0x or 0X (the case of the “x” does not matter), followed by a sequence of digits in the range 0 through 9 and a (or A) through f (or F). Hexadecimal digits a (or A) through f (or F) represent values in the range 10 through 15. For example:  int i = 0x3fff;   // Hexadecimal constant int j = 0X3FFF;   // Equal to i  To specify an unsigned type, use either the u or U suffix. To specify a long type, use either the l or L suffix. For example:  unsigned uVal = 328u;             // Unsigned value long lVal = 0x7FFFFFL;            // Long value specified                                    //  as hex constant unsigned long ulVal = 0776745ul;  // Unsigned long value
user-0 提问: 新人求教

回复:
user: user-1
content: 引用 2 楼 chunzhuyitou 的回复:题主补充一句，我有部分用例是对的，不可能是某些问题32位内的就没问题。再大的不行

user: user-2
content: 没看出那不对

user: user-3
content: 为啥不用>>  ，移位运算符

user: user-4
content: 他说保证它们长度<=10^5 并且没有前导 0，2^16<10^5<2^17，那你a[17]、b[17]、c[18]不就足够了吗

user: user-0
content: 题主补充一句，我有部分用例是对的，不可能是某些问题

user: user-1
content: 长度<=10^5 ，不能保证int型的sum1、sum2能保存的
user-0 提问: 新手求救

回复:
user: user-0
content: 引用 4 楼 sghcpt 的回复:楼主，把相应代码改为下面代码看看~~~~ if (flag3 == 1)printf("Your password is tai luan le.\n"); else if (flag1 == 1 && flag2 == 1)printf("Your password is wan mei.\n"); else if (flag1 == 1 && flag2 == 0)printf("Your password needs zi mu.\n"); else if (flag2 == 1 && flag1 == 0)printf("Your password needs shu zi.\n");谢谢，就是这里出错了

user: user-0
content: 引用 5 楼 zjjone 的回复:不好意思说反了，应该把(flag1==0&&flag2==1)修改为(flag1 == 1 && flag2 == 0)谢谢，就是这里出错了

user: user-1
content: 不好意思说反了，应该把(flag1==0&&flag2==1)修改为(flag1 == 1 && flag2 == 0)

user: user-2
content: 楼主，把相应代码改为下面代码看看~~~~ if (flag3 == 1)printf("Your password is tai luan le.\n"); else if (flag1 == 1 && flag2 == 1)printf("Your password is wan mei.\n"); else if (flag1 == 1 && flag2 == 0)printf("Your password needs zi mu.\n"); else if (flag2 == 1 && flag1 == 0)printf("Your password needs shu zi.\n");

user: user-1
content: (flag1==0&&flag2==1)和(flag1&&!flag2)这能一样吗？改为(!flag1&&flag2) 你这是在考大家眼力啊

user: user-3
content: else if(a[i]=='.') ;  //这个括号是中文吧

user: user-3
content: 什么错误提示？
user-0 提问: 新手求救

回复:
user: user-1
content: 难不成你想说你输入完成后程序智淑初一个结果就结束了，没办法继续输入？

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: gets函数的一些问题

回复:
user: user-1
content: 引用 5 楼 qq_35194071 的回复:[quote=引用 4 楼 wang0635 的回复:] 因为前面 scanf("%d",&n); 输入最后的回车，也会被后面的 gets(a); 得到，成一个空字符串，所以实际要多循环一次，第一次就是处理空串的 哦，所以就要用getchar()来释放回车，然后就可以正常了是吧。[/quote] 可以的，那样n就不用加一了

user: user-0
content: 引用 4 楼 wang0635 的回复:因为前面 scanf("%d",&n); 输入最后的回车，也会被后面的 gets(a); 得到，成一个空字符串，所以实际要多循环一次，第一次就是处理空串的 哦，所以就要用getchar()来释放回车，然后就可以正常了是吧。

user: user-1
content: 因为前面 scanf("%d",&n); 输入最后的回车，也会被后面的 gets(a); 得到，成一个空字符串，所以实际要多循环一次，第一次就是处理空串的

user: user-0
content: 如果，没有n+1，他只能输出7行

user: user-0
content: 输入 8 A-T B-F C-F D-F C-T B-F A-F D-F A-F D-F C-F B-T B-T A-F C-F D-F B-F D-T A-F C-F A-T C-F B-F D-F D-T B-F C-F A-F C-T A-F B-F D-F 输出 13224143

user: user-2
content: 不知道爲啥，這樣其實比n多出了一次循環。也許要看原題目的要求吧，或者這句根本就是錯的。
user-0 提问: C/C++ 这段代码什么意思啊

回复:
user: user-1
content: 0xc0 | (wch >> 6)这个是计算下表的。 wch先先向右偏移6位，得到的值在与0xc0取或。最后得到的结果就是数组的下表。通过数组下表找到对应的数组值，然后在与encoded求和，将得到的结果赋值给encoded.  下一句同理

user: user-2
content: 从 if (wch <= 0x07FF) {        // non-ASCII <= 0x7FF 这行代码的注释来看，是处理非ASCII字符的，至于下面的代码是什么意思，应该要根据代码上下文或者函数功能说明来判断比较吧。。

user: user-3
content: 具体不知道什么含义，就代码而言就是把一个小于0x07FF的数字，拆成前5位后6位的的两段，然后再对应到hexenc中的编码 形如110XXXXX，10XXXXXX这样的两部分，然后和hexenc对应 这个结构看起来和UTF8的定义是一样的，你可以参考一下UTF8的定义

user: user-4
content: 谢邀。 楼主代码是截了urlencode的一部分吧。 如果楼主想问这个干吗用的，我能回答是url转码用的。防止中文乱码的。 具体为啥要这么写，本人对字符的定义没有咋研究过，帮不上忙哈。
user-0 提问: 关于typedef

回复:
user: user-1
content: 实际效果是一样的，只是可读性的区别

user: user-2
content: 这个根据情况定的，比如typedef char *a[5]与typedef char（*a)[5]这两个意思就不同

user: user-3
content: 看你自己怎麽理解方便了，效果一樣的。 一般來説我習慣於給一個長運算式子加一些括號，以方便閲讀，即使不加括號不影響運算順序。

user: user-4
content: 第二个没必要加括号，加了括号似乎更不好理解了。

user: user-5
content: 个人感觉这种typedef (int *) test 更清晰一点

user: user-6
content: 需要括号的时候必须有括号，不需要的时候最好不写

user: user-7
content: test1 my_test1; 	test my_test; 	 	int a = 1; 	my_test = &a; 	my_test1 = my_test; my_test和my_test1的值相同，所以说以上两个typedef定义的类型别名等价。
user-0 提问: ubuntu16编译vlc3的win32库make时报 undefined reference to '_imp____acrt_iob_func' 求解

回复:
user: user-0
content: 长时间没登录了，抱欠，这个问题一般在2.几的版本用CONTROLB不匹配时产生的，3.0版本以上不用CONTROLB，不会产生这个问题，3版本以上看我的博客里有相关编译说明，依路子编译基本都能编译出来

user: user-1
content: 楼主请问，你这个问题在你帖子中没看明白具体怎么解决的，能简单说一下吗？

user: user-0
content: 长时间没来，解决办法可以看我的贴子啦

user: user-2
content: 楼主解决了么,,我在ubuntu16下编译vlc3.0.4也遇到同样的问题

user: user-0
content: 自已再顶下，求高手

user: user-0
content: 有人能帮看下吗？

user: user-0
content: 楼上请问下，我依据UBUNTU编译VLC的WIN32库，  所有的源码都是在GIT上获取的，需要有改动吗？

user: user-3
content: win32 是windows下的，  API 不兼容呀呀，应该选linux 或者平台通用项目

user: user-0
content: 请高手帮看下VLC编译的问题，

user: user-0
content: 是提示找不到符号，但所有代码都是在VLC官网上DWON的，试了多个版本，编译也是按上面的步骤做的，  现在这个错误不知道怎么解决，谁能帮看下，不胜感激

user: user-4
content: 提示找不到符号

user: user-0
content: 有高手能帮忙看下吗？多谢
user-0 提问: 结构体指针做形参，实参可用结构体数组访问？？

回复:
user: user-1
content: 引用 9 楼 qq_34991245 的回复:[quote=引用 1 楼 wang0635 的回复:] 以数组形式出现的形参，实际上就是指针。写成数组形式只是为了好看。真正的数组自己是无法作为参数用的 这里的确是可以用指针访问，但是在访问超过temp[0].a的时候，并没有对其他的temp[i].a赋值，如果temp[i].a的地址刚好被其他数据占用，就会发生一些意想不到的错误。[/quote] ① 没有对 temp[i].a 赋值，因为系统并没有给该程序分配这块内存，所以当你赋值后，该值仍然不确定，因为有可能这块内存的值被其他程序改变过，也有可能这块程序未被其他程序改变，像你的结果一样。 ②  因为 C 语言对指针不做限制，所以能利用指针访问到未分配的内存，如果这块内存已经被占用，就会发生冲突。

user: user-0
content: 引用 1 楼 wang0635 的回复:以数组形式出现的形参，实际上就是指针。写成数组形式只是为了好看。真正的数组自己是无法作为参数用的 这里的确是可以用指针访问，但是在访问超过temp[0].a的时候，并没有对其他的temp[i].a赋值，如果temp[i].a的地址刚好被其他数据占用，就会发生一些意想不到的错误。

user: user-0
content: 这里的确是可以用指针访问，但是在访问超过temp[0].a的时候，并没有对其他的temp[i].a赋值，如果temp[i].a的地址刚好被其他数据占用，就会发生一些意想不到的错误。

user: user-2
content: 数组确实可以作为参数，传递是指针 不过楼主想问的估计是为什么结构体能用下表访问

user: user-3
content: 指针可以作为数组

user: user-4
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-4
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-5
content: 以数组形式出现的形参，实际上就是指针。写成数组形式只是为了好看。真正的数组自己是无法作为参数用的

user: user-6
content: 你传递进去的是指针  了解一下 形参 值传递 和 指针传递吧

user: user-1
content: 形参是： ①数组名，传递的是地址； ②指针，   传递的是地址。 所以，传递的都是相同的东西，只是表达方式不同。
user-0 提问: vs2010   error C4430 怎么解决？

回复:
user: user-0
content: 引用 2 楼 m0_37690319 的回复:vs   需要预编译头 #include "stdafx"    还有    int  main(){} 谢谢，已解决，stdafx用windows.h代替了，然后main前加了int，程序就不再报错了

user: user-1
content: vs   需要预编译头 #include "stdafx"    还有    int  main(){}

user: user-2
content: #include<stdio.h> main (void) { int x,y; printf("x="); y=scanf("%d",&x); printf("x=%d,y=%d",x,y); return 0; }  改为 int main(void)
user-0 提问: leetcode第三题《无重复字符的最长子串》

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:int lengthOfLongestSubstring(char* s) {     int maxLen = 0;     int len = 0;     char *p = s;   //当前位置     char *ps = s;  //当前子串起始位置     char *pc = s;  //循环比较       while('\0' != *p)     {         while(pc != p)         {             if(*pc == *p)             {                 maxLen = maxLen > len?maxLen:len;                 len = 0;                 ps = ps++;                 pc = ps;                 p = ps;                 break;             }             pc++;         }           p++;         len++;         pc = ps;     }     maxLen = maxLen > len?maxLen:len;     return maxLen; } ① 标红出的逻辑不对，ps++就好，不然就变成： ps = ps; ps++; ② 当找到重复字符的时候，len不用清0，p也不用重置，因为剩余的字符串肯定不会重复。  多谢。已解决。

user: user-1
content: int lengthOfLongestSubstring(char* s) {     int maxLen = 0;     int len = 0;     char *p = s;   //当前位置     char *ps = s;  //当前子串起始位置     char *pc = s;  //循环比较      while('\0' != *p)     {         while(pc != p)         {             if(*pc == *p)             {                 maxLen = maxLen > len?maxLen:len;                 len = 0;  ps = ps++;                 pc = ps;                 p = ps;                 break;             }             pc++;         }          p++;         len++;         pc = ps;     }     maxLen = maxLen > len?maxLen:len;     return maxLen; } ① 标红出的逻辑不对，ps++就好，不然就变成： ps = ps; ps++; ② 当找到重复字符的时候，len不用清0，p也不用重置，因为剩余的字符串肯定不会重复。
user-0 提问: Linux c AES/ CBC/PKCS7/PKCS5加密代码有个接口函数没有看懂。

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。