Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言参数传递

回复:
user: user-1
content: abc函数改成 void abc(int &e) {e=123;} 主函数中应该是int e=456;

user: user-2
content: C++还是C  C    引用 5 楼 zhao4zhong1 的回复:#include <stdio.h> #include <stdlib.h>  void abc(int *e) {   *e = 123; }  main() {    auto e=456;    abc(&e);    printf("%d",e); }  ++ 赵老师这个就是 C++ #include <stdio.h> #include <stdlib.h>  void abc(int &e)//改成引用传递 {     e = 123; }  main() {    auto e=456;    abc(e); //引用传递的调用方式和值传递相同    printf("%d",e); }

user: user-0
content: 引用 2 楼 lm_whales 的回复:int abc(int &e);  可以帮忙写一下 具体的程序么？谢谢！

user: user-3
content: #include <stdio.h> #include <stdlib.h>  void abc(int *e) {   *e = 123; }  main() {    auto e=456;    abc(&e);    printf("%d",e); }

user: user-4
content: printf("123");

user: user-2
content: int abc(int &e);

user: user-5
content: #include <stdio.h> int abc(int e); int main(void) {     int e = 456;          e = abc(e);     printf("%d", e); } int abc(int e) {     int e = 123;     return e; }

user: user-6
content: 要想改变实参的值，必须把实参的指针地址作为函数参数传过去，而不是单单将值传过去。否则实参不会改变。

user: user-7
content: 指针   或者把e设为全局变量

user: user-3
content: 对源代码后缀为.cpp的文件，才默认用C++语法编译。

user: user-0
content: 引用 6 楼 lm_whales 的回复:C++还是C  C    [quote=引用 5 楼 zhao4zhong1 的回复:] #include <stdio.h> #include <stdlib.h>  void abc(int *e) {   *e = 123; }  main() {    auto e=456;    abc(&e);    printf("%d",e); }  ++ 赵老师这个就是 C++ #include <stdio.h> #include <stdlib.h>  void abc(int &e)//改成引用传递 {     e = 123; }  main() {    auto e=456;    abc(e); //引用传递的调用方式和值传递相同    printf("%d",e); }  [/quote]  你的程序有错，不能运行
user-0 提问: 大牛们进来看看，A Not allowed system call: runid:64054 :使用了系统禁止的操作系统调用，看看是否越权访问了文件或进程等资源

回复:
user: user-1
content: 出现这个报错大部分是访问越界，或者指针的指向有问题。

user: user-2
content: 在WinXP下运行。

user: user-3
content: 北邮的吧，我也出现这个问题

user: user-4
content: 栈这么小, push的时候不会不够吗
user-0 提问: 带行指针向量的单链表存储稀疏矩阵

回复:
user: user-1
content: #include <stdio.h> #include <malloc.h> typedef int DataType;  struct LNode//数据结构 {     int col;//列     DataType value;//元素值     struct LNode *next;//指向同行下一个非零结点指针 };  void InArray(struct LNode *row[],int r,int col,int value); void PrintArray(struct LNode *row[]);  int main() {     struct LNode *row[5]= {NULL};      InArray(row,0,0,11);     InArray(row,0,3,14);     InArray(row,0,4,15);     InArray(row,1,1,22);     InArray(row,2,4,35);     InArray(row,4,0,51);     InArray(row,4,2,53);      PrintArray(row);     return 0;//程序退出时，malloc的内存会被操作系统自动回收，所以不用free }  void InArray(struct LNode *row[],int r,int col,int value) {     struct LNode *q,*s;      s=(struct LNode *)malloc(sizeof(struct LNode));     s->col=col;     s->value=value;     s->next=NULL;      if (row[r]==NULL) {         row[r]=s;         return;     } else {         q=row[r];         while (q->next!=NULL) q=q->next;         q->next=s;     } }  void PrintArray(struct LNode *row[]) {     int i,j,value;     struct LNode *q;     for(i=0;i<5;i++) {         for(j=0;j<5;j++) {             q=row[i];             value=0;             while (1) {                 if (q==NULL) break;                 if (q->col==j) {                     value=q->value;                     break;                 } else {                     q=q->next;                 }             }             printf("%4d",value);         }         printf("\n");     } } //  11   0   0  14  15 //   0  22   0   0   0 //   0   0   0   0  35 //   0   0   0   0   0 //  51   0  53   0   0 //

user: user-0
content: 在线等，急用

user: user-0
content: 要实现的打印结果
user-0 提问: 请教va_arg(ap,char)编译通过，执行报错的问题

回复:
user: user-1
content: 参数处理时，应该是按照字符串来处理的，虽然你输入了个 ‘h’。 你就按照char*字符串来处理，然后取第一个字符好了。

user: user-2
content: 而参数传递，利用的是提升规则，本质上是语法糖的效果

user: user-2
content: 某些编译器，不能处理，char，short float 则 无论那个编译器都处理不了 因为 val_list,v_start,va_arg,va_end 采用的是宏定义 ，而不是语法糖 的方式实现
user-0 提问: 请问数组值传递是否更改原始数组

回复:
user: user-1
content: 数组，指针，是不同的。唯一能画等号的，就是数组当参数。看c专家编程，里面有写

user: user-2
content: 没有数组作为参数这种说法 这段代码说的是 数组名是一个地址值，复制到了形参变量（指针类型）中，仍然是值参数 被调函数可以通过这个地址值访问原数组位置的内容 于是原数组中的数据就可以由被调函数修改了 形参尽管写成数组的形式，不能掩盖它是自动的、局部的指针变量的事实 所有形参都是自动局部变量，不可能是什么“栈中的数组” 那本书不仅说错了，而且还装作讲道理的，太误导人了

user: user-3
content: 这里的数组退化成指针了。

user: user-4
content: byval_func(x);这样实际是将x的地址复制一份（值传递）传递给 byval_func函数，并没有将x的元素值复制。 所以在 byval_func函数中，1. 如果是以x = other_int_array;这样的方式修改，是不会改变函数外x的值的。2. 如果以x[0] = new_int_val;这样的方式修改，会将函数外的x的第一个元素值修改为new_int_val。示意图如下： 原本的x是一个指向int数组的指针: x --> {1, 2, 3, 4, 5}; 调用byval_func(x)函数后，实际是将x作为指针复制一份，假设在byval_func函数内用infunc_x表示，此时两者指向同一块内存，如下： x --> {1, 2, 3, 4, 5};          ^          | infunc_x 如果用第1种方法修改，修改后如下： x --> {1, 2, 3, 4, 5};  infunc_x --> other_int_array 可以看到，实际是将infunc_x指向其他地方，但是原来的x的指向没有变，还是原来的内存。 如果用第2种方法修改，是将infunc_x指向的数组的第一个元素改为其他值，此时如下： x --> {new_int_val, 2, 3, 4, 5};          ^          | infunc_x 可见，此时虽然是通过infunc_x修改的元素值，但是由于infunc_x和x指向的是同一块内存，x数组的值也同时被修改了。

user: user-5
content: 标准数组不可能值传递，除非你用STL中的vector做数组，值传递效率很低

user: user-6
content: 你这个传递不能定义为值传递。

user: user-7
content: Ｃ,C++ 没有标准数组的值传递方式，数组从来不会整体传递。 Ｃ,C++ 数组参数传递的方式，通常是传递一个指针，这是Ｃ,C++ 通用的 Ｃ++还可以传递数组引用。  顺便说一下，其它语言通常也没有， 通常也是地址传递，或者叫引用传递。 例如　fortran,pascal 等是引用传递　pascal var 参数就是引用传递的，即便非　var,参数，实现上数组也是引用传递的

user: user-8
content: 引用 5 楼 u013356755 的回复:在值传递方式中，数组x将被复制一份，复制所得的数组将被存放在栈中，然后由byval_func()函数接收并打印出来。由于传递给byal_func()函数的是初始数组的一份拷贝，因此在byval_func()函数内部修改传递过来的数组对初始数组没有任何影响。  -----这是书上说的额，  在 C 或 C++ 里，数组都不能作为参数传递。 写成数组形式的参数，实际都是指针。

user: user-9
content: 你的那个参数建议不要写成int i[]这样！ 你不觉得让编译器帮你多做一步对[]的转换好么？ 从i[]转换成*(i) 直接写成int *i 而你问的问题不就知道了！ 形参实参是不同的变量！他不在同一内存中 只是做了简单的复制操作！ 但参数为指针的话！形参与实参所在的地址不同 也就是内存块不同（指针的地址不同）但是指针的值是相同的！ 换句话说编译器重新在栈区申请了一个指针指向同一块内存地址！ 所以不同的是指针自己的地址(&p)不影响指针的值（*p）  看的出来函数参数在这里传送的是地址巧妙的解决的传送数组的低效率方法

user: user-5
content: 其实传入到函数里就只是一个指向数组头的指针了，这样做是为了提高效率，也也是在函数中使用sizeof求数组大小时其实得到的是指针的大小，另在函数内修改数组元素是对外部有影响的，楼主可以自己试一下

user: user-0
content: 在值传递方式中，数组x将被复制一份，复制所得的数组将被存放在栈中，然后由byval_func()函数接收并打印出来。由于传递给byal_func()函数的是初始数组的一份拷贝，因此在byval_func()函数内部修改传递过来的数组对初始数组没有任何影响。  -----这是书上说的额，

user: user-10
content: 我的意思就是以实际运行结果为准。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！的确，书上说的不能更改原始数组，但是在调用函数中修改了数组真的影响到了原始数组，在问是不是这个样子？

user: user-10
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-11
content: printf
user-0 提问: C 语言能干啥？来瞅瞅这！

回复:
user: user-1
content: DOS年代的一些C语言高级编程的书里，经常就有简单的BASIC解释器的实现。

user: user-2
content: 学到家了，做系统，做编译器不难啊~

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:《编译原理》 LEX+YACC Flex+Bison  多谢. 我慢慢消化。。

user: user-3
content: 《编译原理》 LEX+YACC Flex+Bison
user-0 提问: 关于i++和++i

回复:
user: user-1
content: 在C中i++和++i都是右值，不过++的位置会决定一个执行的先后顺序。比如 i=1； n=i++；//n=1 n=++i;//n=2

user: user-2
content: 个人意见不要再研究这些东西了，没什么大用的。

user: user-3
content: 你这样搞纯粹是为了笔试吗，不是的话，没有必要这样搞。

user: user-4
content: 从来不写这样的代码。 尽量把代码写的容易读一点。

user: user-5
content: 为什么这么多人探讨 ++i 或 i++的区别？ 你们在实际工作中的代码有见过几次这种混淆的代码？？ 研究这个有什么具体意义？？？ 有这时间还不如研究下内存，或学习下具体的业务

user: user-6
content: 去看本论坛第一个置顶帖,也就是"http://bbs.csdn.net/topics/370153775"

user: user-0
content: 引用 14 楼 lin5161678 的回复:C++ 才是这样  C语言中 全部都不是左值 你的文件后缀名是什么 .c文件

user: user-7
content: () [] -> . ++(后缀自增) --(后缀自减) left to right ! ~ ++(前缀自增) --(前缀自减) + - * sizeof(type) right to left 后缀自增的优先级要高

user: user-7
content: ++i 是左值，没有问题 i++ 是右值，也没问题 ++++i; 虽然可以，但是并不好，因为 两次修改 i值。 ++i++ = ++(i++)当然不可以，

user: user-7
content: ++i=5 的问题是两次修改i

user: user-8
content: C++ 才是这样  C语言中 全部都不是左值 你的文件后缀名是什么

user: user-9
content: 引用 7 楼 CZ_0100001101011010 的回复:C++ primier 第五版，P121 然而以常量为代表的某些左值实际上不能作为赋值语句的左侧运算对象。  (++i)++这样就行了吧 不知道是不是翻译错误，常量是明明白白的右值 用const定义的symbolic constant才是左值

user: user-9
content: i++是左值绝对没问题 如果++i是右值，那么++i=5也没有逻辑上的错误，也许正向上面说的编译器不允许两次赋值 因为后缀自增比前缀自增优先级高，所以 ++i++要解释为：++(i++)，根据LZ的论据1，显然是行不通的。 lm_whales已经说得很明白了

user: user-9
content: 引用 1 楼 baidu_31809147 的回复:左值一定是变量么？ 不是，左值涉及一个内存位置，左值除开变量还有其他； 但是用const定义的符号常量一定是左值； 变量一定是可修改左值。

user: user-7
content: C和C++有所不同 C都是右值 C++  前缀左值，后缀右值

user: user-7
content: 引用 22 楼 mujiok2003 的回复:[quote=引用 8 楼 lm_whales 的回复:] ++i=5 的问题是两次修改i  that's not why the c compiler complains. [/quote]明白了

user: user-10
content: 引用 8 楼 lm_whales 的回复:++i=5 的问题是两次修改i  that's not why the c compiler complains.

user: user-10
content: 引用 20 楼 fefe82 的回复:C 与 C++ 是不同的。  14楼/16楼 已经给出了解答。  C / C++ 在细节的地方有很多不同。各位可以想一下自己贴的答案是在说 C 还是 C++（C++ Primer 说的定然的 C++ 而不是 C）  P.S. 这好像是 C语言 区 ...  ++. that's the point.

user: user-11
content: C 与 C++ 是不同的。  14楼/16楼 已经给出了解答。  C / C++ 在细节的地方有很多不同。各位可以想一下自己贴的答案是在说 C 还是 C++（C++ Primer 说的定然的 C++ 而不是 C）  P.S. 这好像是 C语言 区 ...

user: user-12
content: 这个问题的根本原因是编译器对语法树的解析方式，若根据编译理论，将语法树绘制出来以后便可以清晰的知道无法正确编译的原因
user-0 提问: 函数参数传递的问题

回复:
user: user-1
content: 引用 2 楼 swimmingfish2004 的回复:@user-7 只是单纯探讨为什么？而不讨论是否”有意义“。  那就是对编译器做逆向工程了。

user: user-2
content: printf 参数里面不要用++   --，参数是可变宏的都不要这样用。写在外部。

user: user-3
content: http://bbs.csdn.net/topics/370153775

user: user-4
content: 这些结果，都是对的，不用解释， 唯一的解释就是你用了语言中，不可控的特性（未定义）， 你不能控制你的程序，在不同（编译器，版本，等等）环境下的行为。

user: user-5
content: 有些东西不同编译器解释方式不同的，还有些东西根据运行时状态结果也不同的

user: user-6
content: 能把无意义的东西，讲出个为什么来的，什么结论推不出来？推出来的结论能让人相信吗？

user: user-7
content: 引用 2 楼 swimmingfish2004 的回复:@user-7 只是单纯探讨为什么？而不讨论是否”有意义“。 唯一的意义就是面试的时候考官可以考你

user: user-0
content: @user-7 只是单纯探讨为什么？而不讨论是否”有意义“。

user: user-7
content: 看来目前在CSDN算是周经帖. 查看置顶帖"[置顶] [C/C++板块推荐阅读] 关于C,C++表达式求值顺序. [推荐] [ C++ 语言]"
user-0 提问: 急！急！C语言菜鸟紧急求助！

回复:
user: user-1
content: week = (year + year / 4 + year / 400 - year / 100 - 1) % 7;//输入year的一月一号是星期几 week = (week + total) % 7;//四月份最后一个星期的天数 day = 7 - week + 8;//五月过完四月份最后一个星期剩余的天数+8（第二个星期日）西方：星期日为一个星期的第一天

user: user-2
content: week = (year + year / 4 + year / 400 - year / 100 - 1) % 7 算出这一年的一月一日是星期几。计算原理是这样的：公元元年的一月一日是周六，假设不是闰年的话（闰年是年份除4或除400余数为0，除100余数为0不是闰年，比如2000），那么下一年的的一月一日应该是周日，因为一年365天除以7余1，也就是说，如果没有闰年，每年的一月一日是上一年一月一日的星期天数加1，闰年的话要多加一天，year / 4 + year / 400 - year / 100 就是算出元年至今有多少个闰年， 最后得出year这一年的一月一日是周几。 week = (week + total) % 7 就是算出这一年四月最后一个星期的天数。 day = 7 - week + 8 算出五月第二个周日是第几天。
user-0 提问: call stack 窗口突然弹出，是什么问题啊

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

user: user-0
content: 引用 1 楼 csdn_mr_l的回复:上面的图片不太清晰。 这两张照片稍微清楚一点 这是上面的图。。。。。。

user: user-0
content: 上面的图片不太清晰。 这两张照片稍微清楚一点
user-0 提问: 新人求教！关于不匹配类型转换的问题！

回复:
user: user-1
content: 你这不叫类型转换，这叫错误，从数据类型在内存中的存储，这问题有解

user: user-2
content: 闲来无事，你还可以参考printf的源代码比如： C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\printf.c C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c

user: user-3
content: 确定参数传递，和不定参数的传递有所不同。 因为C,C++标准修改了确定参数的传递方式。 而不定参数的传递方式没有改变。

user: user-3
content: printf 仅仅按照 format 串中的格式，匹配其他参数 不匹配就会出错 至于出错成为什么样子，其实和数据长度有关。 注意，不是数据本身的长度，而是压栈的长度。 char,short,int 在传递的时候，都是int float ,double 都是 double

user: user-4
content: 标识%f时printf会按double来读取参数，而参数是个int，是未定义行为

user: user-5
content: 浮点数与整数的内存模型是不同的
user-0 提问: 新手请教问题，输出错

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

user: user-2
content: # include <stdio.h>  void huhuan_1(int , int); void huhuan_2(int *, int *); void huhuan_3(int *, int *);  int main(void) { 	int a = 3; 	int b = 5; 	 	huhuan_3(&a, &b); //huhuan_2(*p, *q); 是错误的, huhuan_2(a, b);也是错误的 	printf("a = %d, b = %d\n", a, b);  	return 0; }  //不能完成互换功能 void huhuan_1(int a, int b) { 	int t;  	t = a; 	a = b; 	b = t;  	return; }  //不能完成互换功能 void huhuan_2(int * p, int * q) { 	int * t;//如果要互换p和q的值，则t必须是int *,不能是int,否则会出错  	t = p; 	p = q; 	q = t; }  //可以完成互换功能 void huhuan_3(int * p, int * q) { 	int t; //如果要互换*p和*q的值, 则t必须定义成int,不能定义成int *, 否则语法出错  	t = *p;  //p是int *,  *p是int 	*p = *q; 	*q = t; }

user: user-0
content: 谢谢大家，我明白了

user: user-3
content: 传值和传地址的问题！

user: user-4
content: 两个输入数字用空格隔开试试。

user: user-5
content: 先不说是否交换了两个数，你输入的根本没有存进去。 问题出在 scanf("%d  %d",&x,&y); 中。 键盘输入的东西由scanf函数转换成十进制整数（注意，整数，int），存入从&x和&y开始的内存中（注意，存入的时候占据int大小的空间），而你实际给准备的内存大小是多少呢？uint8_t x,y; char那么大，于是写入数据时越界了。 结论：scanf中的格式说明一定要与输入项的大小匹配。如果确实要那样输入，可以 uint8_t x,y; int        xx, yy; scanf("%d  %d",&xx,&yy);  x = xx, y = yy;

user: user-0
content: 我用的是啊哈C的软件，谢谢了，我换一个环境试试

user: user-6
content: void swapdata(uint8_t dat_x,uint8_t dat_y) 参数用引用吧；或者地址，需要改函数体和调用方式。

user: user-6
content: void swapdata(uint8_t dat_x,uint8_t dat_y) 参数用引用吧，或者地址，需要改函数体。

user: user-7
content: 你这都能改变，那就怪了！ 你只改变了形参的值！ 去看看参数的传递吧！

user: user-8
content: 你在什么环境下运行的，我在vs2010下运行正常。
user-0 提问: 一道C语言算法题

回复:
user: user-0
content: 懂了，不过二楼还是说错了一点，Q.front->next = p->next ,我调试的时候改了

user: user-1
content: 从程序来看，该queue的头结点应该是个空结点，专门表示头结点，所以实际删除的是第二个。但程序似乎有问题，Q.front=p.next 应该是Q.front=p->next 吧。
user-0 提问: C语言使用指针去除字符串中的空格

回复:
user: user-1
content: 这个程序效率太低了，遍历一次字符串去掉一个空格，总共要遍历sizeof（字符串）次

user: user-0
content: 谢谢各位， 我也是用的三楼同学的思路，不过是字符串先倒序，再各个单词倒序。  四楼中要另外开辟内存，如果数据量大的话就不太好吧。

user: user-2
content: #include <ctype.h>  int isspace(int ch);

user: user-3
content: 你那种方法挺麻烦，给个新的思路：  新建另一个字符数组，遍历你之前的字符数组，如果不是空格，就复制到新的数组中

user: user-4
content: 先将每个单词倒过来，即将“I am from shanghai”转换成“I ma morf iahgnahs”，再将整个字符串倒过来变成“shanghai from am I”

user: user-0
content: char *fun1(char *ptr) {     char *p,*q;     for(p=ptr;*p!='\0';)     {         q=p;         if(*q==' ')         {             while(*q!='\0')             {                 *q=*(q+1);                 q++;             }         }         else               p++;      }     return ptr; }  谢谢，改了一下，这样就可以了。  另外， 将“I am from shanghai”倒置为“shanghai from am I”  我看了一下别人的代码，不太明白它的算法思想，能帮忙解释一下吗？  char *fun2(char *src) {     char temp;     char *start = src, *end = src, *ptr = src;      while(*ptr++ != '\0')     {         if(*ptr == ' ' || *ptr == '\0')         {             end = ptr - 1;             while(start < end)             {                temp = *start;               *start = *end;               *end = temp;               start++;               end--;             }             start = end = ptr + 1;         }     }      start = src;     end = ptr - 2;     while(start < end)     {           temp = *start;           *start = *end;           *end = temp;           start++;           end--;     }     return src; }

user: user-4
content: 用指针p去遍历字符串ptr中所有字符，当遇上空格时，用指针q通过字符串由后向前移一位来覆盖空格，不过这个算法有局限，当连续有两个空格时，就只能删除一个空格
user-0 提问: 字符串限制的问题

回复:
user: user-1
content: 引用 1 楼 walkiz 的回复:这样数组溢出了，只是由于你的程序比较短小，恰好没有出现问题而已。你可以用更安全的scanf_s函数，另外装5个字符，需要6个字节，C语言的字符串是靠最后的'\0'来结尾的。  你看看你的 最后打印一下 i j 的值，　应该变了，　　越界给覆盖了　 黑客就可以利用这样的漏洞　来玩弄你的程序

user: user-2
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-3
content: 数组越界的结果是不确定的。  不确定的结果的一种可能就是得到你想得到的结果。但你永远不可能知道什么时候可以得到你想得到的结果。

user: user-4
content: 编译器为了提高程序在cpu中运行效率，在编译程序时，都会做字节码的对齐，int a[5]，它其实不是分配5个空间，有能分配32个空间，所以你数组越界几个字节，不会出错

user: user-5
content: 这样数组溢出了，只是由于你的程序比较短小，恰好没有出现问题而已。你可以用更安全的scanf_s函数，另外装5个字符，需要6个字节，C语言的字符串是靠最后的'\0'来结尾的。
user-0 提问: 大家可以帮我看下是怎么回事么？调试的时候老个有错误

回复:
user: user-1
content: typedef struct cmp  // 是否要加个结构体名 { double _real; //复数的实部 double _imag; //复数的虚部 } cpxNum;         //定义结构体类型cpxNum表示“复数”  printf("请输入第一个复数："); scanf_s("%lf%lf", &c1._real, &c1._imag); //double型输入 //assigna(c1, real, image); print(c1);  printf("请输入第er个复数："); scanf_s("%lf%lf", &c2._real, &c2._imag); //double型输入 //assigna(c2, real, image); print(c2);

user: user-2
content: 至少下面有问题  printf("请输入第一个复数："); scanf_s("%d %d", &c1._real, &c1._imag); //这里 //assigna(c1, real, image); print(c1);  printf("请输入第er个复数："); scanf_s("%d %d", &c2._real, &c2._imag); //这里 //assigna(c2, real, image); print(c2);
user-0 提问: 对于无符号整形溢出的理解

回复:
user: user-1
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对应的汇编并单步执行观察相应内存和寄存器变化。）  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-2
content: 引用For the purposes of this token conversion and evaluation, all signed integer types and all unsigned integer types act as if they hav e the same representation as, respectively, the types intmax_t and uintmax_t defined in the header <stdint.h>. 167) 也就是说宏定义里的整形被看作intmax_t的，而整形字面量是int的
user-0 提问: 数据结构 队列操作 程序段错误

回复:
user: user-1
content: Deque CreateDeque() { Deque queue=(Deque)malloc(sizeof(struct DequeRecord)); PtrToNode head=(PtrToNode)malloc(sizeof(struct Node)); head->Next=NULL; queue->Front=head;  queue->Rear=head; }  并没有返回参数，但是你在main函数中是D = CreateDeque();这么用的
user-0 提问: 文本模式写入与读出问题

回复:
user: user-1
content: 那是因为用%c读不出回车换行符，你得用二进制方式读写文本文件

user: user-2
content: fscanf的格式串中有空格的话,就会跳过所有空字符(空格,tab键,回车)

user: user-0
content: 不是有写入吗为什么取不出来？那如果我不把回车（stu[i].ch）写入文件，而是在格式说明里面的第一个%s前面加一个空格，第二行的第一个字符（102的1）会变成第一行的最后一个字符？

user: user-0
content: 引用 1 楼 ant2012的回复:那是因为用%c读不出回车换行符，你得用二进制方式读写文本文件 不是有写入吗为什么取不出来？那如果我不把回车（stu[i].ch）写入文件，而是在格式说明里面的第一个%s前面加一个空格，第二行的第一个字符（102的1）会变成第一行的最后一个字符？
user-0 提问: 请问Window系统自带的ping.exe是那种开发语言编写的？其后台工作原理是？

回复:
user: user-0
content: 引用 4 楼 fly_dragon_fly 的回复:ping 是icmp echo, 找这协议看就行了  嗯，谢谢，根据你的提示我找到这篇文章  ICMP协议之ping实现

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl 先下载安装MSDN98，再参考： MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\PING\PING.C  http://bbs.csdn.net/topics/390374955  谢啦，不过还是网上搜个ping.c文件方便些。  找到这两个源文件：  Apple ping.c Microsoft ping.c  使用了汇编

user: user-1
content: ping 是icmp echo, 找这协议看就行了

user: user-2
content: MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl 先下载安装MSDN98，再参考： MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\PING\PING.C  http://bbs.csdn.net/topics/390374955

user: user-0
content: 找到两篇文章。  Ping的原理及实现 Ping过程 原理 详解(图)

user: user-3
content: 有源代码了看不懂是自己的问题. 自己要慢慢学习, 就跟一群人问c++怎么开发GUI程序一样, 一步一步来. 域名到ip地址的转换是 gethostbyname. 再底层地点就是操作系统干的事的, 上面只管调用.
user-0 提问: 【数据结构】PTA网站上的一个双端队列题

回复:
user: user-1
content: 因为 某些编译器，会自动加上返回值， 或者不认为无返回值，是个错误. 最多给个警告，而警告很多时候会被忽略

user: user-0
content: 引用 3 楼 user-1 的回复:1）函数 Deque CreateDeque() 没有返回任何值，显然写错了  大哥真乃神人也！！加了return D;以后直接满分啊！！感激涕零！  现在我唯一的疑问是：为何我没return在自家编译器上还过还能运行了呢？而且没有任何报错呢？  感觉离结贴进了。

user: user-0
content: 从能够运行来看，是它自己加上返回值了，然而都不报告一下，害我纠结了一下午。

user: user-1
content: 1）函数 Deque CreateDeque() 没有返回任何值，显然写错了

user: user-1
content: 这个双端队列分明就是个双向链表啊。 而且持有首尾两个节点。 初始化为首尾皆指向空的头结点。 第一个节点。两个指针皆空。 前后插入数据方式一样，所不同的就是指针处理方式不同

user: user-0
content: 交上去是段错误。
user-0 提问: 这个快排程序编译没问题，为什么在运行时自动停止了，求各位大神帮帮忙

回复:
user: user-1
content: 下标越界？我猜的

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <time.h>  #define size 10  void quicksort(int *a, int left, int right) { 	int f, t; 	int rtemp, ltemp; 	ltemp = left; 	rtemp = right;  	int mid = (left + right) / 2; 	f = a[mid];  	while (ltemp < rtemp) 	{ 		while (a[ltemp] < f) 		{ 			++ltemp; 		} 		while (a[rtemp] > f) 		{ 			--rtemp; 		} 		if (ltemp < rtemp) 		{ 			t = a[ltemp]; 			a[ltemp] = a[rtemp]; 			a[rtemp] = t;  			--rtemp; 			++ltemp; 		} 	}    	if (left < ltemp - 1) 	{ 		quicksort(a, left, ltemp - 1); 	} 	 	if (rtemp + 1 < right) 	{ 		quicksort(a, rtemp + 1, right); 	} 	 	 }  void main() { 	int i; 	int a[size]; 	srand(time(NULL)); 	for (i = 0; i < size; i++) 	{ 		a[i] = rand() % 100; 	} 	printf("排序前：\n"); 	for (i = 0; i < size; i++) 	{ 		printf("%d ", a[i]); 	} 	printf("\n");  	quicksort(a, 0, size - 1); 	printf("排序后：\n"); 	for (i = 0; i < size; i++) 	{ 		printf("%d ", a[i]); 	} 	printf("\n"); }
user-0 提问: 想请问一下，C语言中的调试可以后退一步吗？感觉只要走错了一步，就回不了头，

回复:
user: user-1
content: http://blog.csdn.net/CherylNatsu/article/details/6436570

user: user-2
content: vc调试的可以试试拖拽箭头

user: user-3
content: 不可以

user: user-4
content: 为什么要后退一步？想要修改某个变量的值吗？
user-0 提问: 用vs学习c，出错“lnk 1120两个无法解析的外部命令，还有两个错误”今天刚装，望指教

回复:
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: mian->main

user: user-3
content: 函数名写错了…

user: user-4
content: 有可能是缺少库文件

user: user-5
content: 把mian改为main  sacanf改为scanf

user: user-6
content: main scanf 请仔细检查

user: user-7
content: int main()  不是mian()……

user: user-0
content: 跟着教材打的代码，应该没错吧
user-0 提问: 求大神来帮忙  最后一步一直运行不了

回复:
user: user-1
content: #include<stdio.h> #include<string.h> #define N 5 int main() { 	int num[N]; 	char name[N][10]; 	char str[10]; 	int i,j,temp,top,mid,g,n,end; 	for(i=0;i<N;i++)             // 输入员工号跟姓名 	{ 		printf("Please input number : "); 		scanf("%d",&num[i]); 		printf("Please input name : "); 		scanf("%s",&name[i]); 	} 	for(i=0;i<N;i++) 	{ 		printf("%d %s\n",num[i],name[i]); 	} 	for(i=0;i<N-1;i++)             //开始排序 	{ 		for(j=0;j<N-1;j++) 		{ 			if(num[j]>num[j+1]) 			{ 				temp=num[j]; 				num[j]=num[j+1]; 				num[j+1]=temp; 				strcpy(str,name[j]); 				strcpy(name[j],name[j+1]); 				strcpy(name[j+1],str); 			} 		} 	} 	printf("This is new rank :");          //排序的结果 	for(i=0;i<N;i++) 	{ 		printf("%d   %s\n",num[i],name[i]); 	} 	printf("Please input you wanna seach number : ");         //准备查找 	scanf("%d",&n); 	top=0; 	end=N-1; 	g=0; 	while(g==0) 	{ 		mid=(top+end)/2; 		if(n == num[mid]) 		{ 			printf("This is your seach result: %d %s\n",num[mid],name[mid]); 			g=1; 		} 		else if(n < num[mid]) 		{ 			end=mid-1; 		} 		else if(n>num[mid]) 		{ 			top=mid+1; 		} 	} 	if(g==0)	 		printf("cannot find !\n"); 	return 0; }  建议楼主贴代码时点下图按钮编辑下，这样方便读代码：

user: user-2
content: 引用 4 楼 qq_31757983 的回复:[quote=引用 2 楼 user-2 的回复:] while(g==0);  多打了一个分号，导致在while死循环。 大哥  这个while 循环如果把所有结果寻找一遍 还没有会不会自己跳出去  显示查找不到？[/quote]  while循环体的内容没有执行，一直在检查g==0. 多打一个分号相当于如下效果：  while(g == 0) {}    // 循环体内容为空

user: user-0
content: 引用 2 楼 user-2 的回复:while(g==0);  多打了一个分号，导致在while死循环。 大哥  这个while 循环如果把所有结果寻找一遍 还没有会不会自己跳出去  显示查找不到？

user: user-0
content: 引用 2 楼 user-2 的回复:while(g==0);  多打了一个分号，导致在while死循环。 我试试

user: user-2
content: while(g==0);  多打了一个分号，导致在while死循环。

user: user-0
content: 这是运行的结果
user-0 提问: 第一次写头函数，求大神帮助

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:typedef前的extern去掉  函数原型放在头文件中 函数实现放在.C文件中  函数原型前的extern也是多余的，默认就是extern 函数实现前不需extern谢谢！问题解决了

user: user-1
content: typedef前的extern去掉  函数原型放在头文件中 函数实现放在.C文件中  函数原型前的extern也是多余的，默认就是extern 函数实现前不需extern
user-0 提问: MDK ARM程序调试时的error

回复:
user: user-0
content: 我试过了啊，cpal_usercallback_template.c和cpal_usercallback.c我去掉其中任意一个再编辑，就出现一大堆问题了。

user: user-1
content: 你到底要的是哪一个？ 去掉另一个呗

user: user-2
content: 用jtag断点调试

user: user-0
content: 我再补充一句，每个程序单独运行时都没有错误的。
user-0 提问: 貌似自加运算符有时很坑爹啊

回复:
user: user-0
content: 引用 1 楼 github_27756899 的回复:for(i=0;*s1;i++,*T++,s1++) 改为： for(i=0;*s1;i++,(*T)++,s1++) 试试。 ×与++运算符的优先级一样，并且结合性都是从右到左 忽然发现我好二啊，调了那么久都没注意到这个情况丢大人了··········

user: user-1
content: 从错误上看出是内存非法访问的错误，一般这种情况产生于指针越界访问  *T++， ++运算符和*取值运算符的优先级是同一级别，但是从右到左进行运算，即先++，再取值，这样在进行第二次for循环时已经发生越界，只不过，越界访问的内存可能处在程序自身的地址空间内且是可写的，就不会报错；第三次循环时，可能指针指向到其它内存空间中，操作系统就会抛出一个异常来阻止这种非法操作的发生

user: user-2
content: for(i=0;*s1;i++,*T++,s1++) 改为： for(i=0;*s1;i++,(*T)++,s1++) 试试。 ×与++运算符的优先级一样，并且结合性都是从右到左

user: user-2
content: 下次注意就行,呵呵。
user-0 提问: C语言新手问题

回复:
user: user-1
content: //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-2
content: 一楼的解释很好，谢谢，学习了~~~

user: user-3
content: 你就这样想，你传参，函数接收，想当于赋值， 而你如果主函数写 char a[3][4]; char **p=a; 也是错误的，写成 char (*p)[4]=a;就对了; 所以你得，给出相应类型才能赋值

user: user-4
content: 静态二维数组，如arrat[3][4] = {"abc","cba","cab"};  它的逻辑结构是二维的，其物理存储结构是一维的，只不过，在编译时，编译器通过地址偏移来实现了我们二维结构的访问。楼主可以通过测试发现，其元素的地址是连续的。  char *array[] 指针数组，它物理结构和逻辑结构都是二维的，即每个元素是一个指针，指向一个字符串地址。 char**是二级字符指针，它的结构和指针数组很像，区别在于，二维指针没有在定义时指定各个维度的大小，指针数组指定了第一维的大小。  在进行参数传递时，数组名已经退化成地址，即静态二维数组会退化成一维数组的首地址，所以完全可以通过二级指针来访问指针数组，而不能用二级指针访问静态二维数组  如果想传递静态二维数组，有三种定义形参的方式： 1  定义一个静态二维数组，需要第二维度的大小，如：void fun(int arr[][10]) //第一维的大小没有意义，可以写入，也可不写，第二维的大小主要是用于地址偏移。支持二维逻辑访问，即在函数中arr[i][j]表示第i行第j个元素 2  定义一个一级指针，需要在调用时，将二维数组强制转换成一级指针。由于已经退化成一级指针，不支持二维逻辑访问。在函数中访问中，通过自己计算偏移量来实现对元素的访问。 3  定义一个数组指针，需要定义指针指向数组的宽度，如：void fun(int (*arr) [10])  //这种方式和第一种等价，其实参调用方式和访问跟第一种一样
user-0 提问: 如果输入的数据量过大还能用数组来存储么?

回复:
user: user-1
content: 1M是100 W 20W int 也才 0.80M 在栈上 也勉强可以的 不过在静态区，或者堆上更好

user: user-2
content: 用 malloc 存在堆上就行了。

user: user-3
content: 可以动态分配，也就是在堆上分配，栈可能不够了，20万还不算大，如果更大的话可以考虑用数据库管理

user: user-4
content: 你可以malloc

user: user-5
content: 队列不是好方法。那么大的东西得用 std::map来存储了。 因为数组是连续内存空间，不能存在间隔。所以首先申请20W个元素都是一个问题。 不适用链表是因为链表查询效率慢。 使用map来存储因为map使用树结构，而且设置一个KEY值查找速度也比链表快。
user-0 提问: %0*.*.f是什么意思？

回复:
user: user-1
content: 精度由后面对应的的参数确定，此处是n<=0?2:n+3和n<=0?0:n

user: user-2
content: 参看：http://baike.baidu.com/link?url=tpOTLb801U8gqkGDBmqz5jU_D397v5lsosNuHw8XvykOvFclQf4eGpACG5kkgeEcu5f7ZpoqztPm2fdt_autr_
user-0 提问: 求高手帮我瞧瞧，这是哪出了问题，搞了半天，也没结果，实现输出最大值和最小值与平均值

回复:
user: user-1
content: 引用 楼主 qq_31713481 的回复:#include<stdio.h>  float max,min;  void main() { 	float score[10],i,aver; 	float average(float score[i]); 	printf("Please enter your data\n"); 	for(i=0;i<10;i++） 		scanf("%d",&score[i]); 	aver=average(a[],10); 	printf("%d,%d,%d\n",max.min,aver); } float average(float score[]) { 	int i; 	float sum=0,aver; 	max=score[0]; 	min=score[0]; 	for(i=0;i<10;i++) 	{ 		sum+=a[i]; 		if(max<a[i]) 			max=a[i]; 		if(min>a[i]) 			min=a[i]; 	} 	aver=sum/10; 	return aver; } 修改后的代码： #include<stdio.h>  float max,min;  void main() { float score[10],aver; int i; float average(float score[],int num); printf("Please enter your data\n"); for(i=0;i<10;i++) scanf("%f",&score[i]); aver=average(score,10); printf("%f,%f,%f\n",max,min,aver); } float average(float score[],int num) { int i; float sum=0,aver; max=score[0]; min=score[0]; for(i=0;i<num;i++) { sum+=score[i]; if(max<score[i]) max=score[i]; if(min>score[i]) min=score[i]; } aver=sum/num; return aver; }  自己找问题，把问题解决了。

user: user-2
content: float average(float score[i]); aver=average(a[],10); 楼主，你这样声明和调用不行吧，变量a又是哪里冒出来的 改成 float average(float score[]); aver=average(score,10);
user-0 提问: time_t最大时间是哪年哪月哪日？

回复:
user: user-1
content: File: "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\time.h":       86: #ifndef _TIME_T_DEFINED       87: #ifdef _USE_32BIT_TIME_T       88: typedef __time32_t time_t;      /* time value */       89: #else  /* _USE_32BIT_TIME_T */       90: typedef __time64_t time_t;      /* time value */       91: #endif  /* _USE_32BIT_TIME_T */       92: #define _TIME_T_DEFINED         /* avoid multiple def's of time_t */       93: #endif  /* _TIME_T_DEFINED */

user: user-2
content: 引用 楼主 baiyunyiyi33 的回复:先摘录百度知道一个答案： time_t实际上就是长整型long int; 如假包换！！ 他用来保存从1970年1月1日0时0分0秒到现在时刻的秒数！ 用time()这个函数获取！  对time_t数据类型的值来说，它所表示的时间不能晚于2038年1月18日19时14分07秒。 Visual C++里有个__time64_t数据类型来保存日历时间，并通过_time64()函数来获得日历时间，这样就可以通过该数据类型保存3001年1月1日0时0分0秒之前的时间。  附： time_t包含在time.h里  #ifndef __TIME_T  #define __TIME_T   typedef long time_t;  /* 时间值time_t 为长整型long int(这里缺省类型就是int哈，可以省略不写)的别名*/  #endif    ———————————————————————————— 这里的最大时间是2038 01 18 19 14 07; 但是我写了一个小程序输出这个时间对应的time_t,发现是0x7FFF8F7F. 怎么回事？不应该是0xFFFFFFFF吗？ 网上的东西不一定对的，32位的time_t表示的最大时间是UTC 2038-01-19 03:14:07  #include <stdio.h> #include <time.h>   int main(int argc, char *argv[]) {     time_t tks;     struct tm tms;     char buf[] = "1970-01-01 00:00:00";      tks = 0;      tms = *gmtime(&tks);     strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tms);     printf("UTC %s\n", buf);      tms = *localtime(&tks);     strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tms);     printf("CST %s\n", buf);      tks = 0x7FFFFFFF;      tms = *gmtime(&tks);     strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tms);     printf("UTC %s\n", buf);      tms = *localtime(&tks);     strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tms);     printf("CST %s\n", buf);      tks = 0x7FFF8F7F;      tms = *gmtime(&tks);     strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tms);     printf("UTC %s\n", buf);      tms = *localtime(&tks);     strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tms);     printf("CST %s\n", buf);      tks = time(NULL);      tms = *gmtime(&tks);     strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tms);     printf("UTC %s\n", buf);      tms = *localtime(&tks);     strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tms);     printf("CST %s\n", buf);      return 0; }

user: user-0
content: 引用 2 楼 lm_whales的回复:求出这个时间 2038 01 18 19 14 07 - 1970 01 01 00 00 00 = 多少秒看看吧 哦，我看看试验一下是多少。

user: user-3
content: 求出这个时间 2038 01 18 19 14 07 - 1970 01 01 00 00 00 = 多少秒看看吧

user: user-4
content: 他是一个秒数，并不是203801xxxx啊 最大数字也最多是个0x7FFFxxxx，0xFFFFFxxx是个负数，long int是有符号的数字
user-0 提问: 为什么位域计算输出的结果和预期不对

回复:
user: user-1
content: 位段的数据，跟 位段类型等等，都有关系 这里按照 相当于 union{ unsigned char a[2];//s1：3,s2：3，s3：3 char c; }; c=100; 至于从 a【1】还是a[2]算和实现有关

user: user-0
content: 引用 4 楼 初見的畫面的回复:其实是这样子的，和大小端有关系。然后位段结构体分配字节的时候也是以8位对齐标准来划分的。超过8位的重新分配内存，所以你的s3实际上输出的是随机值，也算内存越界吧。你可以多运行几次看看结果，应该每次会不一样，用VS运行的话会报错的。至于s2、s1就是按100的二进制 0110 0100的低六位来取值的，s1是最低3位100，十进制的 值为4，s2位接下来的3位，也是二进制位100，十进制的值为:4.所以输出就是那个样子。 试了好多次S3还是7，改成S:2就OK了，这个超过内存范围的到底是怎么处理的，一直没搞明白

user: user-2
content: 其实是这样子的，和大小端有关系。然后位段结构体分配字节的时候也是以8位对齐标准来划分的。超过8位的重新分配内存，所以你的s3实际上输出的是随机值，也算内存越界吧。你可以多运行几次看看结果，应该每次会不一样，用VS运行的话会报错的。至于s2、s1就是按100的二进制 0110 0100的低六位来取值的，s1是最低3位100，十进制的 值为4，s2位接下来的3位，也是二进制位100，十进制的值为:4.所以输出就是那个样子。

user: user-3
content: 要考虑机器大小端的问题

user: user-1
content: 引用 1 楼 lm_whales 的回复:100 =0x64 = 0110 0100 另外，位段的为顺序，是依赖于实现的为顺序==>位序

user: user-1
content: 100 =0x64 = 0110 0100 另外，位段的为顺序，是依赖于实现的

user: user-1
content: 字节内部的 位顺序，也是和实现有关的

user: user-1
content: 引用 6 楼 lm_whales 的回复:位段的数据，跟 位段类型等等，都有关系 这里按照 相当于 union{ unsigned char a[2];//s1：3,s2：3，s3：3 char c; }; c=100; 至于从 a【1】还是a[2]算和实现有关至于从 a【1】还是a[0]算和实现有关
user-0 提问: 求教关于结构体指针赋值的问题

回复:
user: user-1
content: 程序1： q = p; q= (struct paiming*)malloc(sizeof(paiming)); 连续对q赋值两次，p和q就已经不等价了，两个地址已经不同。 始终记住了，指针变量就是地址，你这两个程序应该都是想把p和q这两个变量当成一个变量用吧，那就必须让他们拥有相同的地址，自己试着分析一下吧，可以尝试去看看这两个指针变量的值。
user-0 提问:  是不是我的VC程序坏了，写个程序结果出不来？

回复:
user: user-1
content: 初学C，scanf 难以理解的一个原因是  C只有值传递，所以不能直接在函数内，部改变传入的参数 只能传入指针，间接改变 指针指向的内容。 另一个原因是  这样单一变量，和字符串（数组）的名字，有所不同。  单一变量变量需要 & 取得地址作为指针参数传递。 字符串（数组）的名字，直接可以当作指针用，不需要 & 来取得地址，直接当作指针参数传递

user: user-1
content: scanf 为输入，结果要改写参数（对应的数据），所以参数一般是为指针------- 很多时候要用 & 取地址，字符串（数组名）本身就是，或者可以看作是地址。------ printf 为输出，结果不改写参数对应的数据，所以一般不用是指针 ---字符串，指针的输出，也还是要指针的，不过字符串本身就是用指针表示，或者数组名表示的---- 字符串以外， 指针输出的的目的，本来就是输出地址的，所以免不了要用指针----

user: user-0
content: 解决了，想了半天 printf("ver %d\n",&a);  &a 改成a就好了

user: user-2
content: 为啥加引用，去掉printf里的引用
user-0 提问: c语言--在arm上奇怪的溢出问题

回复:
user: user-0
content: 引用 楼主 u010424970 的回复:我使用的开发环境是ubuntu下   arm-linux-gcc   4.5.1编译，用网上下载的Insight3加百度到的注册码写代码，共享到ubuntu下使用make编译。 现像： 一个int 型的全局变量，最大合理值一般不会超过1024(实际在那里的日志int大小不到100才对)，但在那个数据在日志显示中为: 808521728(十进制)， 30311000(十六进制) 我的处理办法： 在日志中多加了几行日志输出，看看是哪个地方开始出现这个数据不正常。  使用以下二个输出函数输出日志： API_Trace     这个函数是项目里的定义函数，多地使用。 个人自己加的一个处理宏定义函数： #define debug(format,...) 	  API_Trace(DBG_APP_INFO,"[%s][%s][%d]:"format,__FILE__,__func__,__LINE__,__VA_ARGS__);  个人认为以上还是合理的，奇怪的事出来了，bug消失了。对，没错，就是加了这几行日志，bug消失了。   因为这是公司的代码，问题也不能重现，所以我只是想得到几个可能出现这种情况的分析，多了解了解。   问题补充： 以前我这个项目里也出现过类似的问题，加入日志信息，然后看数据哪里出错了，最后找到一个arm系统上的库函数：vsprintf,在这个函数之前，值都是正常的，到了这个函数调用，进程就死了(在我这arm上运行，如果出现段错误，是不会有提示信息的，而是直接死进程，比如:printf("%s",NULL);这行运行就直接死进程)。问题也是在我找不到解决方案的时候，没有针对这问题写了点代码，这bug就没了。 相信大大你是没有细看我的描述，看了标题才给出这个信息，首先，至少以我了解到的，在arm上调试的信息，不能用vc 里的debug或类似linux下的gdb工具（虽然我也想学，也会其原理，但就是还没用过，都是一直以结果反推原因），公司里的人都是用输出日志来判断，而这个int变量是定义在一个很大的全局结构体上，定义上，int之前有一个512字节的char buff[]空间，buff内容是写死的，很小。  主要问题是，出现这个现象的解释是什么，我想多学习多了解下。如原文中的红色字体： 因为这是公司的代码，问题也不能重现，所以我只是想得到几个可能出现这种情况的分析，多了解了解。

user: user-1
content: 既然加日志无法观测错误，可以把怀疑的地方注释掉，逐步缩小范围

user: user-2
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-0
content: 引用 2 楼 jiqiang01234 的回复:既然加日志无法观测错误，可以把怀疑的地方注释掉，逐步缩小范围 以下是早上想回复但因网络和帐号问题没能及时回复： 这个方法本来我也想用的，我用编写代码的软件返回修改，返回到今天最新(程序是昨天编译的，今天电脑失去控制，强制重起，代码本来是软件打开的，已忘记昨天是否有过其它修改，但我个人理解是与它无关的)，返回最新后，编译后，生成的程序的md5值也不一样了，现象没再现。这个确实也怪我没能保护当时的环境，刚工作不久，很多习惯、svn使用都不怎么好(如果可以也希望能有这方面的文章看看)。 下午发生的情况： 继续处理我所说的溢出情况，全局结构体gsystem里的char buff[120]后定义了一个char str[12],写入buff时，我个人一直认为是成功的，也strlen(buff)过长度小于120，使用memcpy();复制内容到buff的（memcpy第三个长度参数是没有超的），但还就是发现，buff的最后几个字符写入到了str里。 然后修改，加日志，查原因，然后，新的程序在另外一个地方运行的时候又死了，这个地方日志不足，一路奇怪之后，我就使用了make clean，再make，一切正常了。  然后，我找到了以前结的这个项目，也是我写的，在这个地方并不会写数组超出，且经测试通过，
user-0 提问: 请教关于数组统计元素的问题！

回复:
user: user-0
content: 引用 4 楼 yajuie 的回复:有一个函数是断，字符是否字母的，忘记了，你查查， 我的思路如下  1定义结构体，两个成员变量，1,指针(用以计录地址)，2.整型(用以记录字符个数)。  用结构体声明两个变量，1临时，2个存目前找到的最大值，  定义指针指向数组    循环字符串到结尾(指针 != '\0') { 是开始计数与计录地址，(临时结构变量整形值)， 判断是否字母，(否){比对，临时与最大值)               (临时变量大于最大值，把临时值赋结最大值结构体，否则不操作) 临时结构体变量置0 }  以最大值的地址为起点，字符型式输出，直到遇到第一个符号， 谢谢您提供的思路，我已经实现了

user: user-1
content: 有一个函数是断，字符是否字母的，忘记了，你查查， 我的思路如下  1定义结构体，两个成员变量，1,指针(用以计录地址)，2.整型(用以记录字符个数)。  用结构体声明两个变量，1临时，2个存目前找到的最大值，  定义指针指向数组    循环字符串到结尾(指针 != '\0') { 是开始计数与计录地址，(临时结构变量整形值)， 判断是否字母，(否){比对，临时与最大值)               (临时变量大于最大值，把临时值赋结最大值结构体，否则不操作) 临时结构体变量置0 }  以最大值的地址为起点，字符型式输出，直到遇到第一个符号，

user: user-0
content: 引用 2 楼 user-2 的回复:[quote=引用 1 楼 user-2 的回复:] 单词，如何定义？ 1）被空格符号，分割的字目序列，这基本上是英文句子中的单词的状况 2）由字符串中，字母按照字符串中出现的顺序，组合成的字母序列，这样的话就麻烦多了 如果是第一种，只要分割一下句子，记录长度，下标 就可以了。 修正一下 1）被空格符号，分割的字母序列，这基本上是英文句子中的单词的状况 2）由字符串中，字母按照字符串中出现的顺序，组合成的字母序列，这样的话就麻烦多了[/quote] 是您说的是第二种情况，我想了一整下午，还是理不清头绪。

user: user-2
content: 引用 1 楼 user-2 的回复:单词，如何定义？ 1）被空格符号，分割的字目序列，这基本上是英文句子中的单词的状况 2）由字符串中，字母按照字符串中出现的顺序，组合成的字母序列，这样的话就麻烦多了 如果是第一种，只要分割一下句子，记录长度，下标 就可以了。 修正一下 1）被空格符号，分割的字母序列，这基本上是英文句子中的单词的状况 2）由字符串中，字母按照字符串中出现的顺序，组合成的字母序列，这样的话就麻烦多了

user: user-2
content: 单词，如何定义？ 1）被空格符号，分割的字目序列，这基本上是英文句子中的单词的状况 2）由字符串中，字母按照字符串中出现的顺序，组合成的字母序列，这样的话就麻烦多了 如果是第一种，只要分割一下句子，记录长度，下标 就可以了。
user-0 提问: 判断四个数组里分别取一个数相加为0有多少情况？

回复:
user: user-0
content: 谢谢了，我懂你的意思了  二次方与四次方相比。@user-1

user: user-1
content: 搜索只需要 log(N)

user: user-0
content: 不对，你a+b、c+d后得到的集合就是n^2,最后两个集合相加就是n^2遍历两次，更不行了。

user: user-0
content: 你这个要遍历六道，不是更复杂了吗？

user: user-1
content: 1） 求出 AB 中 a+b的集合 2）求出 CB中c+d 的集合 3）求出 （a+b）+（c+d） =0的集合，并求出a,b,c,d
user-0 提问: 汇编小问题

回复:
user: user-1
content: 你说的是哪里里面编译生成的文件？？还是.o文件里的？还是其他

user: user-2
content: 《程序员的自我修养——链接、装载与库》

user: user-3
content: 《程序员的自我修养——链接、装载与库》
user-0 提问: 第一次写头函数，求大神帮助

回复:
user: user-0
content: 引用 8 楼 user-3的回复:引用 3 楼 iyomumx 的回复:[quote=引用 2 楼 csdn_mr_l 的回复:] [quote=引用 1 楼 iyomumx 的回复:] 为什么有那么多extern为了能让其他文件中的函数调用此文件中的函数 完全没必要。 从21行开始到#endif为止都应该放在一个源文件中而不是写在头文件里。所有的extern都可以删掉。[/quote]+1[/quote] 可是我想编译头函数，而不是编译子函数啊

user: user-1
content: 21行开始的函数实现，不需要extern ，放到CPP文件中

user: user-2
content: 引用 2 楼 csdn_mr_l 的回复:引用 1 楼 iyomumx 的回复:为什么有那么多extern为了能让其他文件中的函数调用此文件中的函数 完全没必要。 从21行开始到#endif为止都应该放在一个源文件中而不是写在头文件里。所有的extern都可以删掉。

user: user-0
content: 引用 1 楼 iyomumx 的回复:为什么有那么多extern为了能让其他文件中的函数调用此文件中的函数

user: user-3
content: 引用 3 楼 iyomumx 的回复:引用 2 楼 csdn_mr_l 的回复:[quote=引用 1 楼 iyomumx 的回复:] 为什么有那么多extern为了能让其他文件中的函数调用此文件中的函数 完全没必要。 从21行开始到#endif为止都应该放在一个源文件中而不是写在头文件里。所有的extern都可以删掉。[/quote]+1

user: user-0
content: 引用 6 楼 iyomumx的回复:引用 5 楼 csdn_mr_l 的回复:[quote=引用 3 楼 iyomumx的回复:][quote=引用 2 楼 csdn_mr_l 的回复:] [quote=引用 1 楼 iyomumx 的回复:] 为什么有那么多extern为了能让其他文件中的函数调用此文件中的函数 完全没必要。 从21行开始到#endif为止都应该放在一个源文件中而不是写在头文件里。所有的extern都可以删掉。[/quote] 可是我不想在源程序中定义子函数，而是想编译一个头函数啊。[/quote] 如果你不介意代码膨胀的话： typedef前的extern删掉 15到20行删掉 21行后的extern改为static[/quote] 删掉15~20行之后函数不就无声明了吗。那还能引用吗

user: user-2
content: 引用 5 楼 csdn_mr_l 的回复:引用 3 楼 iyomumx的回复:[quote=引用 2 楼 csdn_mr_l 的回复:] [quote=引用 1 楼 iyomumx 的回复:] 为什么有那么多extern为了能让其他文件中的函数调用此文件中的函数 完全没必要。 从21行开始到#endif为止都应该放在一个源文件中而不是写在头文件里。所有的extern都可以删掉。[/quote] 可是我不想在源程序中定义子函数，而是想编译一个头函数啊。[/quote] 如果你不介意代码膨胀的话： typedef前的extern删掉 15到20行删掉 21行后的extern改为static

user: user-0
content: 引用 3 楼 iyomumx的回复:引用 2 楼 csdn_mr_l 的回复:[quote=引用 1 楼 iyomumx 的回复:] 为什么有那么多extern为了能让其他文件中的函数调用此文件中的函数 完全没必要。 从21行开始到#endif为止都应该放在一个源文件中而不是写在头文件里。所有的extern都可以删掉。[/quote] 可是我不想在源程序中定义子函数，而是想编译一个头函数啊。

user: user-2
content: 为什么有那么多extern
user-0 提问: 此程序为什么输入一个字符会循环两遍？

回复:
user: user-0
content: 求解决，谢谢~

user: user-0
content: //exercise5.c --- exercise 5 in chapter 6. #include <stdio.h> int main(void){ 	int rowsize; 	int rows, cols; 	char ch_enter, ch_print;  	printf("Enter a letter in uppercase:\n"); 	while (scanf_s("%c", &ch_enter, 1) == 1 && ch_enter != '\n'){ 		rowsize = ch_enter - 'A' + 1; 		for (cols = 1; cols <= rowsize - 1; cols++) 			printf(" "); 		printf("A\n"); 		for (rows = 2; rows <= rowsize; rows++){ 			for (cols = 1; cols <= rowsize - rows; cols++) 				printf(" "); 			for (cols = 1, ch_print = 'A'; cols <= rows; cols++) 				printf("%c", ch_print++); 			for (cols = 1, ch_print = 'A' + rows - 2; cols < rows; cols++) 				printf("%c", ch_print--); 			printf("\n"); 		} 		printf("Enter a letter in uppercase:\n"); 	} 	printf("exit"); 	getchar(); }  这样写就自动退出循环了

user: user-1
content: //把回车键也当作了一个输入字符 while (scanf_s("%c", &ch_enter, 1) == 1 && ch_enter != '\n'){
user-0 提问: /操作符的问题求解！

回复:
user: user-0
content: 我晕 没给得了分。

user: user-0
content: 谢谢 优雅而标准。

user: user-1
content: 这段话在问，-9/4到底是等于-3还是等于-2？ 运行结果是-2
user-0 提问: 求一本啊哈C完整的电子书，哪位大神有资源啊

回复:
user: user-1
content: 你qq多少，我有要不要

user: user-2
content: 上taobao.cm  1毛 多得是啊！不过我感觉还是实体书好，感觉看着直观 印象深刻点

user: user-3
content: 是不是这本 http://pan.baidu.com/share/link?uk=2990505722&shareid=2384030286&third=4

user: user-4
content: http://search.dangdang.com/?key=%B0%A1%B9%FEc%D3%EF%D1%D4 省一天饭钱买一本。
user-0 提问: 有没有c语言进阶教材推荐

回复:
user: user-1
content: 你做这种练习应该对算法要求比较高，可以看看数据结构与算法方面的书。

user: user-2
content: MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl 先下载安装MSDN98 再参考其中的例子代码。

user: user-1
content: 《深入理解C指针》 《C语言点滴》 《C语言课程设计案例精编》 也算基础的吧
user-0 提问: c语言运行问题

回复:
user: user-0
content: 可我还是不懂

user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-2
content: 整数型看16进制比较简单, 把下面值拷到计算器里面就可以看结果 INT_MAX : 32位, 0x7FFFFFFF LLONG_MIN: 64位 0x80000000 浮点数直接用2的冪表示 DBL_MAX: 64位, 11位指数位, 显然最大为全1(二进制) , 按规定指数全1, 尾数必须为0, 则表示最大值为2^(2047-1023) FLT_MIN: 32位, 8位指数位, 规定规格化指数位最小为1, 即表示2^(1-127),  FLT_EPSILON: 32位,23位尾数, 超过即不能表示, 即2^-23

user: user-3
content: 2147483647 = 2^31 - 1 9223372036854775808 =  2^63

user: user-4
content: 你输入的数据不合法 或者未初始化数据

user: user-5
content: 你认为这个头痛，那你去看下，c标准好像4 字节的int取值大小在  - 2^23 - 1 ~2^23 - 1,int型在内存中是以反码存在，4 字节反码存储大小在   -2^23  ~ 2^23 - 1。 ---这个信息在csapp中看到的
user-0 提问: 文件的运用

回复:
user: user-1
content: fopen fprintf fscanf fclose

user: user-2
content: C 需要 关闭文件 C，C++ 都要检查打开文件成功没有

user: user-2
content: C++文件很好用啊 C也不错  C++:  int i,j,k; int m,n,l; ........................ fstream fs(filename); fs<<m<<n<<l; fs<<v[i][j][k]; //也许可以直接输出 v;  c: int i,j,k; int m,n,l; 。。。。。。。。。。。。 FILE *fp= fopen(filename,"r"); fprinntf("%d，%d,%d\n",m,n,l); //循环吧 fprintf("%d",a[i][j][k]);  ...........
user-0 提问: 为什么会有输出超限的错误!  快把我逼疯了，求大神们指点，    （针对 oj  检测）

回复:
user: user-0
content: 发帖的时候代码有点变化了，原先程序的输出结果是和题目一样的  void action(struct fx *head1,struct fx *head2,int s1,int s2)   函数中的    if(head2!=NULL||head1!=NULL)    应为 (head2!=NULL&&head1==NULL)||(head1!=NULL&&head2==NULL)  谢谢指出缺点，看来还得慢慢调整，可以说说一般什么情况会引起输出超限吗

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

user: user-2
content: 我把你的程序编译后，用样例输入测试，结果输出是2 5 1 0 5 4 3 0 与样栵输出不同，显然程序有问题。  1. 函数太长，不方便找错误，比如冒泡排序，可以单独写个函数，再如定义中间变量，也可以另一个swap函数。 分解成的每个函数都测试通过，再合起来测试。 2. 变量与新类型命名，尽量全称，不要用a,b,c或出现数字，这样不易理解 3. 除了一元操作符紧贴变量，其他运算符前后加个空格，不要省大括号，注意缩进
user-0 提问: 数据库链表编译出错，已经不知道该怎么修改了，望各位高手赐教，不胜感激！！

回复:
user: user-0
content: 用的是VS2010，用了VC++也是这问题，到底要怎么改？毕竟自己并不是很懂C语言。

user: user-1
content: vs2013 编译无措

user: user-2
content: 编译问题要自己解决： 错误提示已经很明确了。
user-0 提问: 求教大神1-100奇数的平均值问题，为啥对比的结果不同，谢谢

回复:
user: user-1
content: 自然是不一样的嘛，循环结束的条件不一样，不过你这个代码建议改一改，（2*i+1)这种写法总觉得好别扭。。。。。。

user: user-2
content: 一个循环是2*i+1<100 另一个是 2*i-1<100  结果能一样？

user: user-3
content: 你两端代码i的取值范围不一样，最后输出的i也不一样啊。  定义一个int sumi=0; 然后在循环里写 sumi++;  最后ave=sum/sumi;

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

user: user-5
content: 两个循环虽然都是50次，但是第一个循环结束时是50，第二个是51
user-0 提问: 这段程序看不太懂，求帮忙指点一下。

回复:
user: user-1
content: else if(++pos>=MAXCOL)  这条判断就已经+了 每次调用一次 pos 都会判断 自然也就+1了！

user: user-2
content: if(++pos>=MAXCOL) ->  pos = pos+1; if(pos>=MAXCOL)

user: user-2
content: else if(++pos>=MAXCOL)  ->

user: user-3
content: 引用 2 楼 qq_30239507 的回复:引用 1 楼 user-3 的回复:++pos是什么意思，不会不明白吧？明白啊，问题是++pos>=10不成立啊，pos也++了么？ ++pos是一元操作符，也就是说是否与其他运算符搭配没有关系。无论如何都会自增

user: user-0
content: 引用 1 楼 user-3 的回复:++pos是什么意思，不会不明白吧？明白啊，问题是++pos>=10不成立啊，pos也++了么？

user: user-3
content: ++pos是什么意思，不会不明白吧？
user-0 提问: c语言IF的用法

回复:
user: user-0
content: 数学是硬伤啊啊

user: user-1
content: 希望对你有帮助。 代码如下： #include <stdio.h> #include <math.h>  void main(void) { 	float a,b,c,d,x1,x2; 	scanf("%f%f%f",&a,&b,&c); 	d=b*b-4*a*c; 	if(d>=0) 	{ 		x1=(-b+sqrt(d))/(2*a); 		x2=(-b-sqrt(d))/(2*a); 		printf("x1:%f,x2:%f\n",x1,x2); 	} 	else 	{ 		printf("此方程无实根\n"); 	} }   输入三个数，它们之间要有空格。如:1 4 0

user: user-2
content: 引用 楼主 yabyijue 的回复:编写程序求一元二次方程  ax^2+bx+c=0     的实根，求实根的公式为：              ，方程的三个系数a、b、c的值从键盘输入。如何编程？？ 有现成代码 http://blog.csdn.net/jhq0113/article/details/8042375

user: user-3
content: 尼玛，把公司带进去不就行了吗？？？？

user: user-4
content: printf("这么简单也不动脑想想啊？\n");

user: user-5
content: 消灭零回复╮(╯▽╰)╭是不是问题太简单没人回答

user: user-6
content: 这估计 是入门程序猿  的作业题。。。

user: user-7
content: 作业题不答~
user-0 提问: 出现segment fault 11

回复:
user: user-1
content: 引用 4 楼 zhao4zhong1 的回复:进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令 我前面说错了,这才是我想说的.你信吗?我打字打快了.

user: user-2
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-3
content: 用gdb调试吧

user: user-1
content: 你用gdb run一下你编译出来的程序,看看他在那里出现了内存泄露.

user: user-4
content: 段错误一般是出现在内存的非法使用上，你看看是不是有内存越界，指针指向等等问题。
user-0 提问: 这段代码在vs2015下能正常调试运行,但是用gcc编译器的时候就会发生re错误为何?

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:用gdb调试。  呃 我是去答在线评测的题目然后那个评测系统用的是gcc编译器  主要是奇怪的是微软自带的cl调试器很正常地通过运行了  但是在gcc上就是过不了

user: user-0
content: 引用 2 楼 liubo_1993 的回复:void spirit(int *a, int b[]) { int i, j, k; for (i = 0, j = 10; i < 21; i++) { if (*(a + i) == -1)break; non(*(a + i), b); }这函数里面的k没用上  int compare(int *a, int *b) { int res = 1,i=0; for (; i < 11; i++, a++, b++) { if (*a != *b)return 0; } return 1; }这个函数的res没用上和这个没关系啊 ==  这些没用上 最多也只是浪费个4字节的内存  不会导致编译不通过的

user: user-1
content: void spirit(int *a, int b[]) { int i, j, k; for (i = 0, j = 10; i < 21; i++) { if (*(a + i) == -1)break; non(*(a + i), b); }这函数里面的k没用上  int compare(int *a, int *b) { int res = 1,i=0; for (; i < 11; i++, a++, b++) { if (*a != *b)return 0; } return 1; }这个函数的res没用上

user: user-2
content: 用gdb调试。
user-0 提问: 把一个整型数组的后N位数字前置到开头的程序的片段除了问题

回复:
user: user-0
content: this is the whole of my code   # include<stdio.h> # define M 6 # define N 2  void input(int num[]); void change(int *pointer[]);  int main(){ 	int num[M]; 	int i; 	int *p[M];  	for(i=0; i<M; i++) p[i]=num[i]; 	input(num); 	printf("what you input:\n"); 	for(i=0; i<M; i++) printf("%d\t", num[i]); 	putchar('\n'); 	change(p); 	printf("after change:\n"); 	for(i=0; i<M; i++) printf("%d\t", p[i]);  	return 0; }  void input(int num[]){ 	int i;  	printf("input a string of numbers:\n"); 	for(i=0; i<M; i++){ 		if(!i) printf("input the 1st number:\n"); 		else if(1==i) printf("input the 2nd number:\n"); 		else if(2==i) printf("input the 3rd number:\n"); 		else printf("input the %dth number:\n", i+1); 		scanf("%d", &num[i]); 	} }  void change(int *pointer[M]){ 	int i; 	int temp[N]; 	/* 	for(i=0; i<N; i++){ 		*temp=*pointer[i]; 		*pointer=*pointer[M-N+i]; 		*pointer[M-N+i]=*temp; 	} 	*/ 	for(i=0; i<N; i++) temp[i]=*pointer[M-N+i]; 	for(i=M-1; i>N-1; i--) *pointer[i]=*pointer[i-N]; 	for(i=0; i<N; i++) *pointer[i]=temp[i]; }

user: user-0
content: 引用 1楼user-3 的回复:形参int *pointer[M]改成int (*pointer)[M],使用时同样加括号为什么用这种指针啊，此处并不涉及多维数组啊。

user: user-1
content: 调用的地方是怎么样的

user: user-2
content: 楼主，为何在函数参数中定义一个指针数组，定义一个数组不行吗，楼主，你贴下你的函数调用

user: user-3
content: 形参int *pointer[M]改成int (*pointer)[M],使用时同样加括号
user-0 提问: 输入一个字符，如果该字符为小写字母，就转换为大写字母并输出；如果是大写字母，就转换为小写字母并输出；如果是其它字符，就原样输出

回复:
user: user-0
content: 是啊，太粗心了

user: user-1
content: scanf输入字符要使用&

user: user-2
content: scanf函数用错了，少个&