Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 关于C语言指针与二维数组的理解，对否欢迎大家讨论

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

user: user-2
content: 数组、指针、内存分配

user: user-3
content: 数组就是指针,指针就是数组,没有区别

user: user-0
content: 引用 4 楼 u010165006 的回复:[quote=引用 楼主 u010165006 的回复:] 比如一个数组int a[5]： a[i]==*(a+i)，a[0]==*a，两边取地址： &a[i]==a+i，&a[0]==a，a为数组首地址即第0个元素的地址，a[i]的类型是int，a的类型是int * 比如一个二维数组int a[5][10]： a[i]==*(a+i)，a[i][j]==*(*(a+i)+j)，a[i][0]==**(a+i)，a[0][0]==**a，两边取地址： &a[i]==a+i，&a[i][j]==*(a+i)+j，&&a[i][0]==a+i，&&a[0][0]==a，看第一项和第三项： a+i==&a[i]==&&a[i][0]，a[i][j]的类型是int，a[i]的类型是int *，a的类型是int **  二维数组首地址a，和第0行首地址a[0]，虽然二者值相等， 但是类型不一样，指针的类型就是对指向的数据的解释，所以二者是不同的。 a[i]的类型应该是 (int *)[10][/quote] a[i]的类型是int *，a的类型是int (*)[10]

user: user-0
content: 引用 楼主 u010165006 的回复:比如一个数组int a[5]： a[i]==*(a+i)，a[0]==*a，两边取地址： &a[i]==a+i，&a[0]==a，a为数组首地址即第0个元素的地址，a[i]的类型是int，a的类型是int * 比如一个二维数组int a[5][10]： a[i]==*(a+i)，a[i][j]==*(*(a+i)+j)，a[i][0]==**(a+i)，a[0][0]==**a，两边取地址： &a[i]==a+i，&a[i][j]==*(a+i)+j，&&a[i][0]==a+i，&&a[0][0]==a，看第一项和第三项： a+i==&a[i]==&&a[i][0]，a[i][j]的类型是int，a[i]的类型是int *，a的类型是int **  二维数组首地址a，和第0行首地址a[0]，虽然二者值相等， 但是类型不一样，指针的类型就是对指向的数据的解释，所以二者是不同的。 a[i]的类型应该是 (int *)[10]

user: user-4
content: http://bbs.csdn.net/topics/390649853

user: user-5
content: 路过~~~

user: user-6
content: 。。。楼主你数学学得一定很不错，各种等式变换
user-0 提问: foj1750 ，自己测了好几组数据都没问题，提交还是WA，求指导。。。。

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:node[1].parent=0;  题目里有说1一定是根么？确定根节点就是看哪个数字没在左右儿子中出现过，但是怎么确定其他点的父节点是谁呢？？

user: user-0
content: 引用 1 楼 user-1 的回复:node[1].parent=0;  题目里有说1一定是根么？对哦，是没有，但是它节点的编号是不是一定是1-N啊？？

user: user-1
content: node[1].parent=0;  题目里有说1一定是根么？

user: user-1
content: 引用 2 楼 fzu215 的回复:[quote=引用 1 楼 user-1 的回复:] node[1].parent=0;  题目里有说1一定是根么？对哦，是没有，但是它节点的编号是不是一定是1-N啊？？[/quote] 看题目里怎么说咯。没说就不能默认。
user-0 提问: ctrl+c中断程序时出现异常，搞不定了……

回复:
user: user-0
content: 引用 5 楼 sai_johnny 的回复:[quote=引用 3 楼 taodm 的回复:] 楼主啊，换本合格的教材吧。 还让你用ctrl_c结束程序的垃圾书都可以直接扔了。 呃。。怎么说？  OJ题目里很多都是给出多种测试用例，但没有结束条件。 所以结束程序的话，不是就得ctrl+c么？  以前好像都是while(scanf(...) != EOF)这样来做。 然后这次需要一个字符一个字符的读入，就没想那么多，直接按照主楼的代码做的。 结果就发现这个异常了……[/quote]  引用 6 楼 zhaowech 的回复:ctrl+c对程序来说本来就是异常，在调试的时候VS会捕获这个异常，通知用户处理，单独运行exe应该不会报异常了 此外，用户可以自定义ctrlhandler，来处理这个异常，防止报错 哦哦。主要是以前没有注意到这种异常。所以发现后就觉得很奇怪~~~

user: user-1
content: ctrl+c对程序来说本来就是异常，在调试的时候VS会捕获这个异常，通知用户处理，单独运行exe应该不会报异常了 此外，用户可以自定义ctrlhandler，来处理这个异常，防止报错

user: user-0
content: 引用 3 楼 taodm 的回复:楼主啊，换本合格的教材吧。 还让你用ctrl_c结束程序的垃圾书都可以直接扔了。 呃。。怎么说？  OJ题目里很多都是给出多种测试用例，但没有结束条件。 所以结束程序的话，不是就得ctrl+c么？  以前好像都是while(scanf(...) != EOF)这样来做。 然后这次需要一个字符一个字符的读入，就没想那么多，直接按照主楼的代码做的。 结果就发现这个异常了……

user: user-0
content: 引用 1 楼 jiangsheng 的回复:这是默认的行为 可以用SetConsoleCtrlHandler自定义 哦哦。但是有时可以直接可以把程序结束掉，没有提示中断异常。 而且在刷OJ题时，有一题总是Runtime error，就是结束程序这里出问题了。 题目没给出结束条件，那不就只能ctrl+c来结束程序么？

user: user-2
content: 楼主啊，换本合格的教材吧。 还让你用ctrl_c结束程序的垃圾书都可以直接扔了。

user: user-3
content: 这个在默认情况下都会抛出异常的，ctrl+C就是为了中断存在的，可以用楼上方法自定义下。

user: user-4
content: 这是默认的行为 可以用SetConsoleCtrlHandler自定义
user-0 提问: 求分析代码错误

回复:
user: user-1
content: 非法访问内存 只因为你这样第定义了 char *str="I am a student!"; str指向一个字符串常量 无法被修改 char str[]="I am a student!"; 这样就行了

user: user-2
content: char *str="I am a student!";这个字符串是常量，不能修改，可以改成：char str[] = "I am a student!";
user-0 提问: c语言

回复:
user: user-1
content: 多敲些例子，用着用着就懂了

user: user-2
content: 这三种循环可以相互转换的，至于用哪个，主要看你对于那个比较熟悉，没有很大的区别。

user: user-3
content: 你可以专心用一个 等你把这一个用熟了，你会发现其他两个你根本不需要去学，拿过来就会用 本质都是一样的，代码编译成可执行文件之后甚至有可能一模一样，就看你习惯用哪个

user: user-4
content: 引用 楼主 u012331408 的回复:for, while,do while 如何区分？如何运用更何适？ 运用上都一样，只不过根据具体情况而定有更合适的

user: user-5
content: 跟上节奏。 避免死循环！。。没别的

user: user-6
content: 熟能生巧！。。没别的

user: user-7
content: 引用 5 楼 zhao4zhong1 的回复:不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 whlie (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： whlie (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。 do while也类似。 赵老板 每次都一大堆文字 不累么

user: user-8
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 whlie (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： whlie (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。 do while也类似。
user-0 提问: linux程序设计

回复:
user: user-1
content: 引用 4 楼 wsx199397 的回复:[quote=引用 2 楼 Adol1111 的回复:] 判断peek_character是否被修改过，如果有则直接返回的意思 因为peek_character的初始值是-1所以第一次调用kbhit函数时是不会执行这两句的。然后如果键入了一个值peek_character被修改了，但是接下来肯定要执行readch函数因为被修改了所以肯定不会等于-1，然后执行 if(peek_character!=-1)   {     ch=peek_character;     peek_character=-1;     return ch;   } 就把peek_character重置了，所以每次运行到kbhit时肯定不会这些那两条语句啊。[/quote] 多线程啊，在这条线程还没有重置peek_character的情况下，另一条线程进入了这个函数那么就可以执行啦。

user: user-0
content: 引用 2 楼 Adol1111 的回复:判断peek_character是否被修改过，如果有则直接返回的意思 因为peek_character的初始值是-1所以第一次调用kbhit函数时是不会执行这两句的。然后如果键入了一个值peek_character被修改了，但是接下来肯定要执行readch函数因为被修改了所以肯定不会等于-1，然后执行 if(peek_character!=-1)   {     ch=peek_character;     peek_character=-1;     return ch;   } 就把peek_character重置了，所以每次运行到kbhit时肯定不会这些那两条语句啊。

user: user-0
content: 引用 1 楼 user-2 的回复:不起作用，注释掉了  这个是为了引起注意，我故意注释掉的好哇。。。。

user: user-1
content: 判断peek_character是否被修改过，如果有则直接返回的意思

user: user-2
content: 不起作用，注释掉了
user-0 提问: 局部指针变量的疑问

回复:
user: user-1
content: 堆是堆， 栈是栈， 什么叫结构都在堆栈上啊！  局部变量的话，不是自己分配的应该就是在栈空间了啊！  生命周期就在此变量定义的的{}内呗！ 运行到}系统就自动释放掉

user: user-2
content: 你定义的指针变量（只要没有自己申请内存且没有声明为全局或静态变量），那么都在栈上。 而且记住一点，无论是什么类型的指针变量，它都只占4个字节（不一定，跟平台有关），里面存放地址，所以它并不存在你所说的定义结构体指针变量时，也定义结构体内的成员变量的情况。所以用的时候，你要把指针指向一个已经存在的相同结构体变量的地址。

user: user-3
content: 使用指针要记住一点，“他引用了一个不在当前位置的对象” 对象的位置无关紧要，也许他在.dll文件中。  如果你想在栈中创建结构，那就把结构定义在函数内好了。  结构是不允许在函数间直接传递的。

user: user-4
content: 指针变量，你可以理解为是一个普通变量，占四个字节。所以在栈上存放的。它与普通变量的区别就在该变量里存放的不是普通值，而是地址值，是内存中某个地址的值。

user: user-5
content: 你的指针在局部定义的，那就在栈上，它指向的结构在哪里定义的？

user: user-6
content: 引用 楼主 dragonballlike 的回复:函数中定义一个局部结构指针变量，在编译运行的时候，整个结构都在堆栈上，还是只有结构指针在栈上？ 如果是后者，那结构存储在哪？他的生命期是什么？  指针还是在栈上，指针指向的内容在堆区 仔细区分一下不同变量存储的不同区域 常量区 静态区 栈区 堆区

user: user-7
content: 这个指针如果不是静态的，可必定实在栈上，指向的数据可以在堆上也可以在栈上

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

回复:
user: user-0
content: 引用 5 楼 user-3 的回复:你这是个排序啊，你排序算法有问题阿好的。。醒悟了！ 哈哈 去研究一下~

user: user-1
content: 排序错了！！！

user: user-2
content: 引用 4 楼 qq695181966 的回复:[quote=引用 3 楼 user-3 的回复:] 不是，错了，应该是 *t=*p;     //把p所指向的东西给t *p=*(p+1);  //p+1所指向的东西给p *(p+1)=*t;  //t所指向的东西给p+1我刚才就是按你这么写的 但是输出的结果是不对的~~[/quote] 那是你排序算法本身有问题啊。

user: user-2
content: 指针内容交换，不是指针地址交换。 看楼上的代码就行了。

user: user-3
content: 你这是个排序啊，你排序算法有问题阿

user: user-0
content: 引用 3 楼 user-3 的回复:不是，错了，应该是 *t=*p;     //把p所指向的东西给t *p=*(p+1);  //p+1所指向的东西给p *(p+1)=*t;  //t所指向的东西给p+1我刚才就是按你这么写的 但是输出的结果是不对的~~

user: user-3
content: 不是，错了，应该是 *t=*p;     //把p所指向的东西给t *p=*(p+1);  //p+1所指向的东西给p *(p+1)=*t;  //t所指向的东西给p+1

user: user-3
content: 你这交换的只是指针的值，指针所指向的内容并没有变， 应该改成 t=p; *(p+1)=*p; *p=*t;

user: user-0
content: 我是应该定义一个结构体指针，然后在if{}交换语句中将其作为中间变量来交换地址对吗？
user-0 提问: Typedef struct list node这是什么意思

回复:
user: user-0
content: 引用 2 楼 u011779875 的回复:node 相当于 struct list的替换 link 相当于 node* 双重替换 就是 struct list * 引用 1 楼 u011779875 的回复:typedef struct list node;  typedef node *link;  void main() {     link ptr,head;  } typedef 就是把类型从命名  node p; 相当于 struct list p;  typdef node * link; 相当于 struct list * p;   懂了，谢谢

user: user-1
content: node 相当于 struct list的替换 link 相当于 node* 双重替换 就是 struct list *

user: user-1
content: typedef struct list node;  typedef node *link;  void main() {     link ptr,head;  } typedef 就是把类型从命名  node p; 相当于 struct list p;  typdef node * link; 相当于 struct list * p;
user-0 提问: 用extern修饰的外部变量只能在函数中使用？？

回复:
user: user-1
content: 看C的语法  translation-unit:      external-declaration      translation-unit external-declaration  external-declaration:      function-definition declaration

user: user-2
content: C，C++ 只能表达式（包括函数调用表达式） 1）附属于声明定义语句。 2）写在函数内部。  函数外部只能是声明和定义（包括初始化）； 不能出现独立的执行语句和表达式。  int x=0;              //定义并初始化 double pi =3.1415926; //定义并初始化 int x= sin(pi);//C： 函数调用也不可出现在函数外部。                //C++: 变量可以用函数调用语句（函数调用表达式）初始化，可以出现在函数外部。

user: user-3
content: 引用 2 楼 user-8 的回复:[quote=引用 1 楼 u012348978 的回复:] c 独立编译每一个源文件，所以编译器无权改写一个extern的定义。  而 fun() 是在运行时改写变量i，此时已不存在extern的定义，  外部者，别的编译单元是也[/quote]  extern 的意思是，这只是一个声明。所以，是不会有空间分配和改写的问题。非常感谢，你的帮助，谢谢。

user: user-4
content: all variable

user: user-5
content: 恩，如果a.cpp有 i=5; b.cpp里有 i=2;  你说运行后i要等几呢?  i=2;不是声明也不是定义而是一个赋值语句，是一个可以执行的表达式， 正如楼上所说语句不能在函数外执行。 就好比在函数外的全局区不能调用函数一样。 好比在函数外printf("Hello");是不对的

user: user-6
content: 语句不能在函数外执行，与extern无关。  引用 楼主 lhy080776 的回复://flie1.cpp #incldue <iostream> using namespace std; int i = 1; //一会在别的.cpp中用它 int main() { return 0; }  //file2.cpp extern int i; i = 2; //这里报了错，什么原因？？ void fun() { i = 3; //这里没报错 }

user: user-7
content: 全局区域无法修改已经定义的全局变量的值，只能定义或声明，要到具体的函数中才可以修改。和extern无关，即使在一个编译文件里也是这样。

user: user-8
content: 引用 1 楼 u012348978 的回复:c 独立编译每一个源文件，所以编译器无权改写一个extern的定义。  而 fun() 是在运行时改写变量i，此时已不存在extern的定义，  外部者，别的编译单元是也

user: user-3
content: c 独立编译每一个源文件，所以编译器无权改写一个extern的定义。  而 fun() 是在运行时改写变量i，此时已不存在extern的定义，
user-0 提问: 关于extern的一个问题

回复:
user: user-1
content: 好的程序员不应该依赖于系统的实现，让编译器去做多余的事，除非标准上写清楚可以这样用。

user: user-0
content: 引用 5 楼 CharlesSimonyi 的回复:你的第一个问题我在VS2010中试了，没出错 //a.h extern int a[]; //a.cpp #include "a.h" void fun() { 	a[0] = 1; } //b.cpp int a[] = {1,2,3}; 那真是奇怪了，我在VS2008里编译过不去

user: user-1
content: 引用 8 楼 a130098300 的回复:[quote=引用 7 楼 Adol1111 的回复:] 好的程序员不应该依赖于系统的实现，让编译器去做多余的事，除非标准上写清楚可以这样用。 不明白你想说什么[/quote] 我是说，你认为有了extern，编译器就会自己去其他文件下找这个东西，而不用引入头文件是很有问题的。因为标准上从没有说一定可以做到，关键是有的编译器允许，有的不允许。正确的作法是指定查找的文件（include相应的文件），而不是让编译器盲目的全局搜索。

user: user-0
content: 引用 7 楼 Adol1111 的回复:好的程序员不应该依赖于系统的实现，让编译器去做多余的事，除非标准上写清楚可以这样用。 不明白你想说什么

user: user-2
content: 你的第一个问题我在VS2010中试了，没出错 //a.h extern int a[]; //a.cpp #include "a.h" void fun() { 	a[0] = 1; } //b.cpp int a[] = {1,2,3};

user: user-3
content: extern只是声明，没有分配内存空间的，先定义，分配了内存空间才能用！！

user: user-4
content: 参阅 程序员的自我修养—链接、装载与库

user: user-5
content: extern 只是申明而已！不是定义！ 没有定义肯定不能用啊！

user: user-6
content: 1）通不过编译其他原因 与 extern int array[];定义无关。  2) 所用的东西都不可以跨过程使用，要使用必须添加到工程中。
user-0 提问: 关于C语言打log的问题，求指导

回复:
user: user-1
content: 直接参考它的，在windows下实现一个呗！又不是很难！ 而且后面可能会很多地方用到！

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-78行添加到你带main的.c或.cpp的那个文件的最前面 //81-85行添加到你的main函数开头 //89-93行添加到你的main函数结束前 //在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中
user-0 提问: Fibonacci（50）调用次数

回复:
user: user-1
content: __INT64

user: user-2
content: 因为调用的次数是第n项的值的两倍-1，求第50项，调用的次数已超出范围

user: user-3
content: 50次 得用64位整形。

user: user-4
content: 输出无符号数要用％u，不过50可能已经超过无符号数的最大值了
user-0 提问: 帮忙看看这个函数咋回事？

回复:
user: user-1
content: 引用 3 楼 AnYidan 的回复:  /* readlines: read input lines */ int readlines(char *lineptr[], int maxlines) { int len, nlines; char *p, line[MAXLEN]; nlines = 0; while ((len = getline(line, MAXLEN)) > 0) if (nlines >= maxlines || p = alloc(len) == NULL) return -1; else { line[len-1] = '\0'; /* delete newline */ strcpy(p, line); lineptr[nlines++] = p; } return nlines; }   帮你排了个版.  /* readlines: read input lines */ int readlines(char *lineptr[], int maxlines) { 	int len, nlines; 	char *p, line[MAXLEN]; 	nlines = 0; 	while ((len = getline(line, MAXLEN)) > 0) 		if (nlines >= maxlines || p = alloc(len) == NULL) 			return -1; 		else { 			line[len-1] = '\0'; /* delete newline */ 			strcpy(p, line); 			lineptr[nlines++] = p; 		} 		return nlines; }  人家返回的值好像就是行数样子的~~~

user: user-2
content: 一般C的函数都是返回错误码，比如长度太长溢出等等，就返回-1之类的错误代码。也可能返回其他的值，视具体情况而定  就readlines来说3楼的代码已经讲的很清楚了。

user: user-3
content: /* readlines: read input lines */ int readlines(char *lineptr[], int maxlines) { int len, nlines; char *p, line[MAXLEN]; nlines = 0; while ((len = getline(line, MAXLEN)) > 0) if (nlines >= maxlines || p = alloc(len) == NULL) return -1; else { line[len-1] = '\0'; /* delete newline */ strcpy(p, line); lineptr[nlines++] = p; } return nlines; }

user: user-4
content: \0 也会读吧，貌似判断无效啊

user: user-5
content: 看函数readlines的定义中到底返回什么。
user-0 提问: c语言的问题

回复:
user: user-1
content: 先想想  输入一个学生学号，一个课程成绩 怎么做  再想想  输入一个学生学号，三个课程成绩 怎么做 （依次顺序输入）  然后想想  输入10个学生学号，3个课程成绩 怎么做  （循环输入）

user: user-2
content: struct StudentInfo {     char stuNo[20];     int score[3]; };  StudentInfo[10] 输入，计算最大值，做标记 输出最大值和学号
user-0 提问: C语言求救啊

回复:
user: user-1
content: 这应该不需要快速排序这么高级的东西吧。

user: user-2
content: qsot() + strcmp

user: user-3
content: 可以直接循环比较就好！

user: user-4
content: 根据ASCII码排序

user: user-5
content: strcmp() 冒泡
user-0 提问: 求大师解答

回复:
user: user-1
content: 慢慢来会好起来的

user: user-2
content: 数组已经算简单了。程序不就是为了处理你想的东西吗？你怎么处理这个过程，你就把这个过程变成代码。

user: user-3
content: 要理解判断循环分支是什么，了解他们的特性用途，这点东西不算事，思考太少，还不理解他们的特性，仔细看看书，多看几遍，多思考，多实验，不是盲目的抄代码，是实验。

user: user-4
content: 仿制--〉制造--〉创新

user: user-5
content: 这个就难了，后面的指针就更麻烦了。 数组的话还是很简单的，只是一个存一组相同类型数据的容器而已。 关键不是数组的难度，是你处理问题的方法。 抛开程序本身，你会怎么处理？10个学生3门课，我就会用3个数组然后每个容量为10来做。 比如 int a[10],b[10],c[10];分别表示语文、英语、数学。然后每个人对应的下标都是一样的a[0]、b[0]、c[0]就是一个人的3门成绩。后面的不用我说了吧，如何计算最高成绩的学号、总分什么的。

user: user-6
content: 抛开写程序 你会怎么处理这个过程呢？ 代码是对你思考问题的表现， 多看看书，对于各种数据结构，数组，链表，类等， 都要有比较深的了解， 最好多思考一下电脑怎么做的，可能会比较难， 但是等你慢慢接触的计算机知识面广了就开阔了 就知道很多原理性的东西了

user: user-7
content: 1、从标准输入读取10个学生的学号和成绩，可以用scanf函数，每次读入一个学生的信息。学号和3门成绩用空格分开（如：0001 80 85 88），以字符串读入后，拆分出来。 2、拆分出来后，可以用学号作为key，3门分数相加值做value，保存到map 3、遍历map比较value，然后输出key和value。当然，比较的过程还要你细化一下，比如定义3个临时变量。

user: user-0
content: 是不是发了两个一样？我在发帖时，第一次好像没发成功。新手，这是第一次发帖。请多多关照。谢谢

user: user-8
content: 你和刚才那个发贴是同班同学呢？还是你注册了两个帐号呢？

user: user-9
content: 多写程序,多练习,多调试.慢慢熟悉了就会了,每个人都有一个不懂到懂到熟悉到精通的过程.....
user-0 提问: 用fopen打开一个结构体指向的字符串，出现错误：参数无效

回复:
user: user-1
content: 引用 4 楼 hackxcm1 的回复:其中i并不是被分配空间，而是被另一个结构给赋值的指针 那也可以的！  注意widows下路径 要用\\ 例如  FILE * pf = fopen("D:\\test.txt", "r");

user: user-0
content: 其中i并不是被分配空间，而是被另一个结构给赋值的指针

user: user-0
content: 先把Inf分配了空间在分配的i  Inf *i = malloc(sizeof(Inf))   //这个已经分配空间了

user: user-2
content: i未初始化直接拿来用，肯定不行，搞不好程序直接退出了。

user: user-1
content: FILE *pTemp; Inf *i; //这个中间你也给i分配内存空间，然后给szName分配空间并赋值！  pTemp = fopen (i->szName, "r"); fprintf(stderr, "%s \n", strerror(errno));

user: user-3
content: 你G盘有xx.exe这个文件吗？  如果"r"方式打开，这个文件必须存在。

user: user-0
content: 错误已解决，再之前的调试分析中没有注意到 由于采用的是fgets(txt,sizeof(txt),stdin)获取的输入，使用的^Z结束的输入。 导致^Z插入的字符串，导致参数无效。 现在使用gets(txt)解决了这个问题。  谢谢的大家的热心帮助！！！

user: user-0
content: 这个可以看下 ，在第一张图片里可以看到i->szBlockName 中的字符创是“G:\\xx.ex”注意不包括双引号  执行到第二张图片时，fopen函数执行完毕，返回给pTemp的地址是0000000  执行到第三张图片时，错误为：参数无效
user-0 提问: 返回指针类型函数的应用场景？

回复:
user: user-1
content: 考虑到内存管理的问题，不建议直接返回指针。因为回收内存的工作必须交给调用者去做了。 一般由调用者开辟内存，然后传入一个指针，函数将结果写在里面。

user: user-2
content: 抽象类型，大部分都是实现者（被调用方）申请空间，使用者不直接操作内存，只管调用接口函数，一般会提供初始和销毁的方法，意思等同malloc，free...

user: user-3
content: 一般引用下，用传参数的方式居多，传入指针地址，然后填充数据！ 在函数体中分配内存不利用后期管理！如数据加上或者减小，以及释放等等问题！ 当然肯定有时候接口不易再修改的情况或者其他情况迫使不得不返回一直指针的话！也必须协议上商量好！被调用者开辟适当空间，调用者来释放的问题！

user: user-4
content: 1.有没有哪位可以说明一下最适合返回指针类型函数的应用场景？ 2.我想利用某个函数构造一个字符串，函数的形参是一些构建字符串的辅助数据， 最后返回这个串的首地址，常用的方法有哪些？    你这个问题的2的场景就很适合使用指针返回 在函数体中根据输入的参数（也可能是参数数组），根据内容计算总长度，申请需要的缓冲内存，按照规则将数据拷贝入缓冲内存，最后返回这个指针  返回指针一般要注意的是，调用者使用返回指针在使用完毕，要负责释放指针对应的内存

user: user-5
content: 引用 3 楼 u012348978 的回复:困难的地方是；c规定，函数以传值的方式使用数据，而指针确是一种引用。即指针是一种“传值型引用” 这在理解和使用上有一点困难。 +1  用指针也是一种值传递，传递的是指针的值，即对象地址。比如传递指针后，使用malloc，那么传递的指针值会被丢弃，就无法操纵原来传递的对象了。同时这个指针形参本身是局部的，与原来的指针毫无关系，malloc后的指针如果不正常返回，就会引起内存泄漏了。此时如果想通过指针操作来达到返回，就必须连同指针的地址一同传递过来了，也就是二维指针。

user: user-6
content: 1) 使用指针是惯例，不使用指针倒是特例。 不使用指针场景是。出于效率的考虑，而使用全局变量和宏函数来代替指针和函数调用。  2）指针是一种引用，即引用一个不在当前位置的对象，感觉就像是在当前位置一样。 因为对象不在当前位置，所以也就不存在所谓传递返回的问题。也就是，在使用指针的场景下“传递就是返回，返回就是传递”。   困难的地方是；c规定，函数以传值的方式使用数据，而指针确是一种引用。即指针是一种“传值型引用” 这在理解和使用上有一点困难。

user: user-5
content: 参考《Effective C++》的条款21，说的就是这类问题。当然这本书讨论的是C++，不是C，不过这条款对C和C++都是适用的。 从效率来说，返回对象的拷贝肯定会有额外的开销，不好。但从内存管理上来说，在函数中返回指针会有更多的问题，比如局部指针（第一个否定），其次是malloc的指针，如果调用该函数的人忘记了释放，或者没有接收返回值，那么必定会引起内存泄漏的问题。 解决方法： 1、调用者开辟内存，传入指针，函数里记得判断指针是否开辟内存。 2、返回该对象（离开函数时原对象自动释放，返回的是该对象的拷贝），而不是指针。然后在调用的地方取地址（当然会麻烦很多，不过会安全一些，C++里返回局部变量一般都是这样处理的）
user-0 提问: 各位大神，小弟急求一个用C语言编写的用户登陆程序

回复:
user: user-1
content: 好吧，我也是新手

user: user-0
content: 有  人   吗   ？ ？ ？

user: user-0

user: user-2
content: #include <stdio.h> #include "conio.h"     //注意要有这个 #include "string.h"    //注意要有这个   bool Login();    int main(void) { 	if(Login()) 	{ 		printf("\n你真他妈厉害，居然知道密码！"); 	}     else 	{ 		printf("\n上个厕所想清楚先！"); 	} 	printf("\n"); 	return 0; }  bool Login() {     char password[8];   //假设密码最多8位     int  xSel; 	unsigned char key=0;     printf("\n请输入密码：");     for(int i=0;i<3;i++) 	{ 		memset(password,0,8); 		xSel=-1; 		while(1) 		{ 			key=getch(); 			if(key=='\r') break; 			if(key=='\b') 			{ 				if(xSel>=0) 				{ 					password[xSel]=0; 					xSel--; 					printf("\b \b"); 				} 				continue; 			} 			if(xSel<7) 			{ 				xSel++; 				password[xSel]=key; 				printf("*"); 			} 		} 		if(memcmp(password,"12345678",8)==0)  			return true; 		else  		{ 			if(i<2) 				printf("\n不对，再来："); 			else 				printf("\n三次都不对，跟老子滚"); 		}  	} 	return false; }

user: user-0
content: 后天就要交了。我真是没办法了。。以后我一定按时完成作业，真的！！！

user: user-3
content: 好好写作业 真是的

user: user-0
content: 哪位好心大哥大姐帮帮忙，我不会啊。。。。。
user-0 提问: ［Lucian Wischik］zip/unzip源码 解压缩加密zip包的BUG

回复:
user: user-1
content: 最近我也遇到解压zip问题，只要是加密的zip就只能解压前一部分！

user: user-2
content: LiteUnzip中也有类似的问题，有人早就发现这个Bug了： http://www.codeproject.com/Articles/13370/LiteZip-and-LiteUnzip?msg=3291831#xx3291831xx

user: user-2
content: 经过我的测试，该Bug的表现为：当解压加密过的zip时，如果文件经过了压缩，那么解压后的文件会缺少最后的12字节，如果文件没有经过压缩（也就是直接打包的方式），会造成死循环。 修复方法为，在 unzip.cpp 文件中查找并注释掉下面一句： pfile_in_zip_read_info->rest_read_uncompressed-=uDoEncHead

user: user-2
content: 他的代码有Bug。

user: user-0
content: 帖子过去很久了，虽然没有满意的答案，还是感谢楼上的建议吧，结贴！

user: user-3
content: 引用 2 楼 dragon9098 的回复:帖子过去很久了，虽然没有满意的答案，还是感谢楼上的建议吧，结贴！ 虎头蛇尾是俗人的习惯， 有始有终是君子的操守。

user: user-3
content: 关闭杀毒软件或防火墙软件的实时防护功能再试试？
user-0 提问: C中默认地址问题

回复:
user: user-0
content: 引用 3 楼 N_sev7 的回复:[quote=引用 1 楼 u012259623 的回复:] 难道AEL默认指向指针数组的最后一个数组元素。 弄明白编译器怎么存储的 比如在一个函数中你定义了三个变量a,b，c（栈区） 只要你获取了任意一个变量的指针，就可以通过这个指针去改变其他变量的值 类推到全局变量的静态区....[/quote] 编译器”偷懒行为“。

user: user-0
content: 引用 7 楼 xiaohuh421 的回复:源码何在?  应该是你程序的问题, 不可能默认最后一个.  经过屡次调试，我现在明白，不是默认指向，全局指针变量都是默认指向NULL，但是编译器在定义一个指针数组后，又定义一个指向同类型的指针变量后，“偷懒"将该数组最后一个定义为该变量。指向同一空间。因为我在下面又定义了一个数组后，数组定义变化，该变量也变化。

user: user-0
content: 引用 9 楼 cfjtaishan 的回复:ALL默认指向的是NULL，因为其为全局变量；若ALL执行最后一个元素，这个可能要看你是如何初始化的。 并为对其进行任何初始化，我知道刚开始他们都是指向0x00000000的，后来我对AEL指针赋一个malloc（）后的地址，可是a[111]的值也跟着变化。我就是这个纳闷的

user: user-1
content: ALL默认指向的是NULL，因为其为全局变量；若ALL执行最后一个元素，这个可能要看你是如何初始化的。

user: user-2
content: 引用 2 楼 user-6 的回复:1 数组是从0开始到110， 不会a[111] 越界了！ 你是如何给AEL赋值的呢？ 2 数组传参的时候和指针的效果是一样的！可能是通过内存地址修改了其内容  我同样这个观点；  你肯定混淆了 a【111】和a【111-1】区别

user: user-3
content: 源码何在?  应该是你程序的问题, 不可能默认最后一个.

user: user-0
content: 引用 3 楼 N_sev7 的回复:[quote=引用 1 楼 u012259623 的回复:] 难道AEL默认指向指针数组的最后一个数组元素。 弄明白编译器怎么存储的 比如在一个函数中你定义了三个变量a,b，c（栈区） 只要你获取了任意一个变量的指针，就可以通过这个指针去改变其他变量的值 类推到全局变量的静态区....[/quote] 谢谢

user: user-0
content: 后面那个line()哪位老师知道？

user: user-0
content: 引用 2 楼 user-6 的回复:1 数组是从0开始到110， 不会a[111] 越界了！ 你是如何给AEL赋值的呢？ 2 数组传参的时候和指针的效果是一样的！可能是通过内存地址修改了其内容 对AEL只是简单的传地址。。。。看到下面的评论，我有点明白，，，，存储器分配全局变量是分配到数据区里的，而应该默认是指向最后的位置。 谢谢

user: user-4
content: 引用 1 楼 u012259623 的回复:难道AEL默认指向指针数组的最后一个数组元素。 弄明白编译器怎么存储的 比如在一个函数中你定义了三个变量a,b，c（栈区） 只要你获取了任意一个变量的指针，就可以通过这个指针去改变其他变量的值 类推到全局变量的静态区....

user: user-5
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-5
content: To set a breakpoint when a variable changes value   From the Edit menu, click Breakpoints.   Click the Data tab of the Breakpoints dialog box.   In the Expression text box, type the name of the variable.   Click OK to set the breakpoint.

user: user-6
content: 1 数组是从0开始到110， 不会a[111] 越界了！ 你是如何给AEL赋值的呢？ 2 数组传参的时候和指针的效果是一样的！可能是通过内存地址修改了其内容

user: user-0
content: 难道AEL默认指向指针数组的最后一个数组元素。
user-0 提问: 编译链接的出现的问题

回复:
user: user-0
content: 引用还有你的目录间隔符到底用\还是用/啊？  用的是/ 这是makefile里面的配置 BASE_SRC := $(BASE_DIR)/ftadvanc.c \             $(BASE_DIR)/ftcalc.c   \             $(BASE_DIR)/ftdbgmem.c \             $(BASE_DIR)/ftgloadr.c \             $(BASE_DIR)/ftobjs.c   \             $(BASE_DIR)/ftoutln.c  \             $(BASE_DIR)/ftrfork.c  \             $(BASE_DIR)/ftsnames.c \             $(BASE_DIR)/ftstream.c \             $(BASE_DIR)/fttrigon.c \             $(BASE_DIR)/ftutil.c \             $(BASE_DIR)/ftinit.c \             $(BASE_DIR)/ftsystem.c \  后来在配置里面加了一个.c文件，这个文件里面有对上面四个函数的定义，链接就没问题了，主要是当时没考虑到，后来和同事讨论的时候，他提到路径的时候，想起来了

user: user-1
content: 恭喜楼主，结贴给我点分

user: user-0
content: 引用引用 3 楼 u012006886 的回复: 这几个函数我已经详细看过，均有定义和实现，单独编译可以正常生成库文件；但是和另外几个库链接的时候就会出现图中的问题，找不到这几个函数  问题出现的很明显了！链接库没有成功接连到！  我把路径过了一遍，最终确定到makefile里面出的问题 重新把定义这几个函数的C文件添加到Makefile里面之后，正常了   感谢楼上几位的回答啊，谢谢了，结贴发分，

user: user-2
content: 引用 3 楼 u012006886 的回复:这几个函数我已经详细看过，均有定义和实现，单独编译可以正常生成库文件；但是和另外几个库链接的时候就会出现图中的问题，找不到这几个函数  问题出现的很明显了！链接库没有成功接连到！

user: user-3
content: 楼主没搞清楚链接。

user: user-0
content: 这几个函数我已经详细看过，均有定义和实现，单独编译可以正常生成库文件；但是和另外几个库链接的时候就会出现图中的问题，找不到这几个函数

user: user-0
content: 引用应该还是LIB没有链接上的缘故。  引用 楼主 u012006886 的回复:    问题如图，unsolved symbol  error 1 单独编译的时候没有问题，把出现问题的这几个注释掉再次编译也没有问题，排除配置和编译环境出问题的可能  实在是头大了  这个应该不会吧，我把出问题的这几个给注掉之后，这个库中的其他都能正常链接，编译也能通过；只是一恢复就会出现这个问题

user: user-4
content: 应该还是LIB没有链接上的缘故。  引用 楼主 u012006886 的回复:   问题如图，unsolved symbol  error 1 单独编译的时候没有问题，把出现问题的这几个注释掉再次编译也没有问题，排除配置和编译环境出问题的可能  实在是头大了

user: user-5
content: 还有你的目录间隔符到底用\还是用/啊？

user: user-5
content: 连接库的顺序有时很重要。
user-0 提问: C语言程序设计的问题

回复:
user: user-1
content: 这可能是对C语言不是很熟悉，练习的可能比较少吧。开始的时候，可能都有这样的体会。首先慢慢锻炼，用C语言的方式去思考问题，多练习，“多抄袭”吧。这儿的抄袭是指学习和练习他人的代码，然后总结领会他人的算法、策略。

user: user-2
content: 楼主的这种心情我能理解，我也是这么过来的…… 除了勤奋练习，多动脑思考，没有什么别的途径，除了天赋极高的人

user: user-3
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-4
content: 上个认真听讲！如果感觉吃力的话，最好提前预习相关内容！ 课后自己多敲代码，多体会理论知识！

user: user-5
content: 引用 1 楼 caozhy 的回复:学编程小的时候就应该学，大学才学，迟了。版主，你为何无处不在，难道要冲月榜第一了

user: user-6
content: 你学说话的时候会考虑“具体方法，步骤”这种问题么？赶鸭子上架的学习肯定是事倍功半的。

user: user-6
content: 学编程小的时候就应该学，大学才学，迟了。
user-0 提问: 一个小问题

回复:
user: user-1
content: 第一个是编译器能够计算出数组的行数，而第二种编译器不知道也无法计算出行数。所以，编译器会报错哦。

user: user-2
content: 设断点看一下，应该是 int a[][3]={{1,2,3},{1,2，0}};  不过不推荐依赖编译器帮你补齐的特性

user: user-3
content: 同理与 int a[];        int a[] = {1,2,3};

user: user-4
content: int a[][3]={{1,2,3},{1,2}}; 编译器可以知道是[2]，但是int a[][3]却不知道[]里面是多大，所以无法分配空间，所以出错

user: user-5
content: 因为编译器可以帮你这个小忙，int a[][3]={{1,2,3},{1,2}};  这个编译器无能为力int a[][3];编译信息不完整，无法触发空间分配。
user-0 提问: n个人分m个财宝,要求任意两个人所分财宝价值差最小.

回复:
user: user-1
content: 每个财宝的价值分别为10 20 30 40 50 你也没说财宝有不一样的价值啊 那这个问题可就大了 哪是简单几行代码搞定的 那就先算总价值 在求没人平局价值 在通过动态规划算法 分配 至于怎么规划 那得自己画画分配逻辑啊 我没写过这么高深的东西

user: user-0
content: 引用 6 楼 u011779875 的回复:你自己改成动态输入的不就完了 难道我要把源程序都给你写出来 那就没意思了  你还不如百度呢 你还哪不懂 引用 6 楼 u011779875 的回复:你自己改成动态输入的不就完了 难道我要把源程序都给你写出来 那就没意思了  你还不如百度呢 你还哪不懂  我意思是不能用n%m ，题目意思其实是比如有3个人分有5个财宝，每个财宝的价值分别为10 20 30 40 50  而不是恒为一个数，他们任意2人之间的最少差值为最少。  就是不知道该用什么算法入手，网上也没有这类似的代码

user: user-1
content: 你自己改成动态输入的不就完了 难道我要把源程序都给你写出来 那就没意思了  你还不如百度呢 你还哪不懂

user: user-2
content: 大概用多重背包问题解，自己搜把，我也就会简单的背包

user: user-1
content: 引用 3 楼 u010652507 的回复:[quote=引用 2 楼 u011779875 的回复:] 那是 F[i] 笔误 财宝的价值是不一样的 不是常数，是任意输入价值的财宝，总数为m个[/quote] 我已经都回答完了啊 你还要那不懂吗

user: user-0
content: 引用 2 楼 u011779875 的回复:那是 F[i] 笔误 财宝的价值是不一样的 不是常数，是任意输入价值的财宝，总数为m个

user: user-1
content: 那是 F[i] 笔误

user: user-1
content: n个人分m个财宝,要求任意两个人所分财宝价值差最小 这个难道不是  n / m吗 当然平分价值差最小了啊 最小就是正好所有人平分啊  看m个财宝是否可以把1个拆开分  我感觉你的题是不可拆分 因为如果可拆分 根本没必要问  int answer; int temp; int F[128];//假定最多有128个人分 temp = n % m ;//均分不了 多出来的 for(i = 0 ; i < n ;i++) {  if(temp != 0){    F = n / m + 1;    temp--; }// 多出来的多分给几个人 没人一个 else {    F = n/m; }//多出来的分完 每人均分 }
user-0 提问: 这两个定义函数的方式有什么区别？希望大家可以帮忙看看？

回复:
user: user-1
content: 一个传引用，一个传值。 理论上前面那个会快一点，后面那个有拷贝（如果没有优化过）

user: user-0
content: 大坑啊，还是不太明白。

user: user-2
content: 这个是c++的引用(SLinkList &space)，你编写自然也就是c++。   结构在函数间传递的方法，c与c++ 是不同的。如果你不知道这一点，哪真是一个坑

user: user-3
content: 我的理解，仅供参考：  （1） 类似定义函数指针类型， typedef struct{     ElemType data;     int cur; }component, SLinkList[MAXSIZE]; 实际上将SLinkList定义为struct{ElemType data;int cur;}[MAXSIZE]这一数组类型，举个例子： SLinkList array;实际上是定义了一个数组array，这个数组array包含MAXSIZE个元素，每个元素都是一个struct{ElemType data;int cur;}类型的变量 即上述定义实际上等价于struct{ElemType data;int cur;} array[MAXSIZE]; （2） 所以函数void InitSpace_SL(SLinkList &space)的参数实际上是一个数组的引用，这个数组必须是形如component array[MAXSIZE]中的array一样；而函数Status InitList(SLinkList space)的参数实际上是一个component类型的指针，在这一点上，类似于void fun(int a[])等价于void fun(int* a)。 实际上，编译器编译时会将两者变换成如下形式： void InitSpace_SL(SLinkList &space) => void InitSpace_SL(component (&)[MAXSIZE]); Status InitList(SLinkList space)    => Status InitList(component* a); 这一点上，lz可以在两个函数里使用printf("sizeof(space) = %d\n", sizeof(space));进行验证，打印的结果前者应该是MAXSIZE*sizeof(component)，后者应该是sizeof(int*) （3） 两种方式能达到相同的效果，说起来与我们调用函数对数组进行操作类似，例如我们定义一个函数void fun(int a[MAXSIZE])，调用时我们将数组名作为实参，但是函数接收的形参只是一个指针，只不过这个指针指向实参数组的起始位置

user: user-0
content: i=L[MAXSIZE-1].cur;还有这个玩意儿
user-0 提问: makefile深度探讨

回复:
user: user-1
content: 第二种写法，相当于没有对头文件做依赖，因此make的时候，不会检查.h和.o的依赖关系。

user: user-0
content: 引用 1 楼 AzraelLamber 的回复:没那些头文件不能链接成功？不太懂有啥子意义，没编译过程？等大牛答疑。。。 我试了一下，两种方法都行，但标准教程上是按第一种写的

user: user-2
content: 没那些头文件不能链接成功？不太懂有啥子意义，没编译过程？等大牛答疑。。。
user-0 提问: 循环结构遇到的问题

回复:
user: user-0
content: 谢谢前辈们,嗯.在这里说声对不起,现在才给了回复.再次感谢.

user: user-1
content: 楼主加油！理解循环结构不用看什么经典的书，把手头的教材好好看一看 最重要的是多练，一定要一个字一个字的打上去，刚开始不会可以照着打， 多多练习自然就懂了

user: user-2
content: 初学者当然是看谭浩强的c语言程序设计 你只要把上面的例子都在电脑上写写，肯定能学会的

user: user-3
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 whlie (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： whlie (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-4
content: 循环结构多做几道练习，多敲点代码，理解一下它的用途，自然就慢慢懂了

user: user-5
content: 下载时提示有病毒

user: user-6
content: 《C Primer Plus》  引用 楼主 u012274409 的回复:循环结构学不会，各位前辈们能不能推荐本书给我这个新手，希望这本书的内容是非常详细、易懂的。在此先谢谢各位前辈了。

user: user-7
content: http://download.csdn.net/detail/user-7/6333711 上面循环章节的例程都敲敲！
user-0 提问: 为啥还要重新定义指针？

回复:
user: user-0
content: 引用 9 楼 AzraelLamber 的回复:[quote=引用 4 楼 max_min_ 的回复:] [quote=引用 3 楼 u012912475 的回复:]  帮帮忙，各位大牛  pa++; 这里指针移动了！每次都移动到数组的下一个元素了！[/quote]  举个例子  int a = 10; int b = a; for ( int i = 0; i < 5; ++i ){     ++b; } printf("%d",b);  你说输出多少？10吗？ 所以要输出10，只能先b=a; 你代码里指针同理，指针只不过是种特别的变量。[/quote]  引用 9 楼 AzraelLamber 的回复:[quote=引用 4 楼 max_min_ 的回复:] [quote=引用 3 楼 u012912475 的回复:]  帮帮忙，各位大牛  pa++; 这里指针移动了！每次都移动到数组的下一个元素了！[/quote]  举个例子  int a = 10; int b = a; for ( int i = 0; i < 5; ++i ){     ++b; } printf("%d",b);  你说输出多少？10吗？ 所以要输出10，只能先b=a; 你代码里指针同理，指针只不过是种特别的变量。[/quote] 首先非常感谢你的回答 但是在你这个例题中，b=15,因为++b是先+1然后在进行运算的，所以b最后的结果是15 然后如果在后面加一个b=a，那b就是10了 再次你的解答，我明白了

user: user-1
content: 引用 4 楼 max_min_ 的回复:[quote=引用 3 楼 u012912475 的回复:]  帮帮忙，各位大牛  pa++; 这里指针移动了！每次都移动到数组的下一个元素了！[/quote]  举个例子  int a = 10; int b = a; for ( int i = 0; i < 5; ++i ){     ++b; } printf("%d",b);  你说输出多少？10吗？ 所以要输出10，只能先b=a; 你代码里指针同理，指针只不过是种特别的变量。

user: user-0
content: 引用 7 楼 jzycode 的回复:[quote=引用 6 楼 u012912475 的回复:] [quote=引用 4 楼 max_min_ 的回复:] [quote=引用 3 楼 u012912475 的回复:]  帮帮忙，各位大牛  pa++; 这里指针移动了！每次都移动到数组的下一个元素了！[/quote] 你好，能不能详细点说，我没明白你的意思，谢谢[/quote]  看书去[/quote]  不知道该看什么啊

user: user-2
content: 引用 6 楼 u012912475 的回复:[quote=引用 4 楼 max_min_ 的回复:] [quote=引用 3 楼 u012912475 的回复:]  帮帮忙，各位大牛  pa++; 这里指针移动了！每次都移动到数组的下一个元素了！[/quote] 你好，能不能详细点说，我没明白你的意思，谢谢[/quote]  看书去

user: user-0
content: 引用 4 楼 max_min_ 的回复:[quote=引用 3 楼 u012912475 的回复:]  帮帮忙，各位大牛  pa++; 这里指针移动了！每次都移动到数组的下一个元素了！[/quote] 你好，能不能详细点说，我没明白你的意思，谢谢

user: user-0
content: 好吧，我有点迷糊了，还是没明白你的意思 这是我第一次学C，请多见谅。 请问 版主大人， Pa++ 可以理解为pa+1=a[1]吗？

user: user-3
content: 引用 3 楼 u012912475 的回复: 帮帮忙，各位大牛  pa++; 这里指针移动了！每次都移动到数组的下一个元素了！

user: user-0
content: 帮帮忙，各位大牛

user: user-0
content: 引用 1 楼 user-4 的回复:#include "stdio.h" main() {     int a[5],i,*pa;     pa=a;     for(i=0;i<5;i++)     {         *pa=i;         pa++;     }     pa=a;     for(i=0;i<5;i++)     printf("a[%d]=%d\n",i,*pa);     pa++; }  Pa++等于pa+i，不就是等于a[i]吗？

user: user-4
content: #include "stdio.h" main() {     int a[5],i,*pa;     pa=a;     for(i=0;i<5;i++)     {         *pa=i;         pa++;     }     pa=a;     for(i=0;i<5;i++)     printf("a[%d]=%d\n",i,*pa);     pa++; }
user-0 提问: 怎样用函数获取 DNS地址？

回复:
user: user-0
content: 引用 1 楼 user-1 的回复: //Linux下 读下配置文件就好了，你自己打开这个文件看看  open("/etc/resolv.conf", O_RDONLY)  还有，我觉得用正则表达式嵌入到代码中比用open更好。 附上表达式： cat /etc/resolv.conf | grep name | awk '{print $2}'

user: user-0
content: 引用 1 楼 user-1 的回复: //Linux下 读下配置文件就好了，你自己打开这个文件看看  open("/etc/resolv.conf", O_RDONLY)  对，我查了查，好像没有其他linux命令能直接操作DNS，一般的方法是修改配置文件。 谢了。

user: user-1
content: //Linux下 读下配置文件就好了，你自己打开这个文件看看  open("/etc/resolv.conf", O_RDONLY)
user-0 提问: 开辟动态连续三维数组 

回复:
user: user-1
content: 习惯了用C的方式分配 BOOL**  m_iconarr  m_iconarr = (BOOL**)malloc(sizeof(BOOL*)*m_size); 	for(int i=0; i<m_size; ++i)  	{  		m_iconarr[i] = (BOOL*)malloc(sizeof(BOOL)*m_size);  	}   free(m_iconarr );  三维的类推

user: user-2
content: int *ARR=new int[512*100*120];//ARR[512][100][120] int *B,*C,*D;  for (B=ARR;B<ARR+  1*512*100*120;B+=    100*120) B[0]='B';//ARR[0..511][0   ][0     ]='B' for (C=ARR;C<ARR+      1*100*120;C+=      1*120) C[0]='C';//ARR[0     ][0.99][0     ]='C' for (D=ARR;D<ARR+          1*120;D+=          1) D[0]='D';//ARR[0     ][0   ][0..119]='D'  ARR[i*100*120+j*120+k]='V';//ARR[i][j][k]='V'

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

user: user-0
content: 我知道这是申请成一维的，但是我想申请成三维的，而且要是连续的空间

user: user-3
content: //申请  smat=new float [NX*NY*NZ]; //释放 delete [] smat;
user-0 提问: 用C向oracle里添加数据

回复:
user: user-1
content: 这也不是C吧

user: user-2
content: 1.可能你需要执行  ExecuteNonQuery() 来正式执行对应的sql语句 2.用 printf 把sql 的值打印出来看看，确认没有sql语法问题

user: user-0
content: 什么意思，我不太会用调试，就只知道有没有错

user: user-3
content: 你调试出来的sql语句是什么样的？
user-0 提问: 如何求char *envs[]的维数 ？

回复:
user: user-1
content: 可以自己写一个

user: user-2
content: linux不知道，VS有，没有的话直接sizeof(envs)/sizeof(char*)

user: user-0
content: 引用 2 楼 user-2 的回复: for( i = 0;i < _countof(envs);i++) ｛｝   linux下有这个 ？  $ man _countof No manual entry for _countof

user: user-2
content: for( i = 0;i < _countof(envs);i++) ｛｝

user: user-0
content: #include <iostream> #include <stdlib.h>  using namespace std; int main() { char *envs[] = {"HOME","USER","HOME","LANG","LINES","LOGNAME","PATH","PWD","SHELL","TERM","TMPDIR","TZ"}; int i =0;  for( i = 0;i < 12;i++)//这里的12怎么用sizeof来计算一下 ？ { cout << envs[i] << endl ; cout << getenv(envs[i]) << endl; } return 0; }
user-0 提问: c语言的问题

回复:
user: user-1
content: 这个最好看看课本吧，再加上一些练习、实践比较有效果。 《C prime plus（第五版）》这本书，可以看看的。

user: user-2
content: 最好是能画图理解，慢慢就理解了

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

user: user-4
content: a[3][3] = {1,2,3,4,5,6,7,8,9}; 上面是个二维数组 数组名也是指针，只不过这个指针是不能移动的，意思是这个指针一直只能指向一个地方 因为是二维数组，所以相当于一个二级指针 *a  的结果还是这个指针（因为a是二级） **a就是一个数据了 这里是第一个数据1 一个不恰当的比喻 你拿到一张记载了大宝藏地点的图纸（a），等你拿着图纸去找大宝藏时，发现自己找到的是大宝藏的一块一块的图纸（*a）（每一块都是有宝藏的），你就可以根据你找到的那块图纸去找对应的宝藏(**a)了

user: user-5
content: 引用 2 楼 max_min_ 的回复:http://download.csdn.net/detail/max_min_/6333711 把这边书下载下去 好好读读！上面的例程都敲敲 ！ 和我想到一样的书 怎么 那书上画图画的很明白 指针到底怎么弄的       引用 楼主 u012506863 的回复:我对指针变量的问题都很迷糊，哪位大神能给我解释一下就是什么时候取地址，取内容，在一维数组，二维数组中的解释。非常感谢 首先你要明白计算机程序基本都是存储在一个相对连续的虚拟进程空间的 ，还有你程序里面的存储的数据也是连续存储的 这样好找啊 要想弄明白一维 二维 指针问题 你就得 先从一维如何存储 二维如何存储行存储 与列存储 二维其实最终是一维 先学C和指针上的图 在画一维数组 二维数组内存存储图 之后再对照你的程序和不懂得慢慢参研  或者你感觉还不够 你可以用汇编实现下

user: user-6
content: http://download.csdn.net/detail/max_min_/6333711 把这边书下载下去 好好读读！上面的例程都敲敲 ！

user: user-7
content: http://ishare.iask.sina.com.cn/f/23415790.html
user-0 提问: 我想问一下要给安卓系统下的手机写个软件的话要在电脑上安装个怎样的编程软件[/b] 用C/C++来编写程序

回复:
user: user-1
content: 去这里问问

user: user-2
content: 要在电脑上安装个怎样的编程软件[/b]用C/C++来编写程序? 安卓手机 现在基本上跑的都是应用程序啊 我这知道用Unity 3d 做几个游戏在手机上跑 但是那都是C#脚本 和javascript脚本写的 没有存C和C++ 可能是因为这个东西开发不快吧 C/C++ 如果是中间层的程序可能是C、C++写的   arm板 就是手机是吧 那么说这种手机需要支持相应的编译器 因为C、C++是编译语言 所以 arm_linux_gcc 编译器吧 这个是猜测 没做过安卓方向的
user-0 提问: 问一个C语言，关于CONST跟指针的问题

回复:
user: user-1
content: 很明显，返回类型不一致，所以会有警告，但是不会报错，因为常量指针可以转换为非常量指针 要消除这个警告就应该这样写 #include <stdio.h>  char const *fun(char const *ptr1, char const *ptr2) { 	return ptr2; }  int main() { 	return 0; }

user: user-2
content: #include <stdio.h>   char const *fun(char const *ptr1, char const *ptr2) {  char *p;  //...     return p; }   int main() {     return 0; }

user: user-3
content: 引用 楼主 u012804737 的回复:char * P(char const * ptr1, char const * ptr2) { 代码内容就不写了，我是想问，在ptr2中，寻找跟ptr1中相同的字符串，只要找到了，就返回这个字符串指针。 } 我自己也看了很多文档就是没弄明白，ptr2的内容是不能修改的，按理说，直接返回ptr2应该就可以了。 我自己调试了下，都不行。警告：return different const qualifiers  请大家告知一下。谢谢. 分数不多，不好意思  你也说了，ptr2的内容是不能修改的，所以返回ptr2+偏移的指针是不可修改的，所以返回值应该是const char*呀，怎么会纠结，如果你返回的是char*，意思是不就变成了返回的指针所指向的内容是可以修改的了吗

user: user-4
content: 指针类型不匹配

user: user-5
content: 返回值类型定义错误。 直接定义为 const char * 就可以返回了。  如果返回找到找不到，返回 bool 类型 如果返回位置，返回指针，或者整型表示位置。

user: user-0
content: 还是没懂。版主说的我明白，被const定义的话，是不可修改的，但是，我是想问如果要返回这个指针变量，那应该返回什么样的。我还是写代码算了。、

user: user-6
content: 一个是const char *，一个是char *，是不兼容的。

user: user-7
content: char const *p;  // 表示p指向的字符串不可以更改 char* p;        // 这个没有const修饰符是可以修改的

user: user-0
content: 在线等。谢谢
user-0 提问: 新人求助 用C语言画一朵玫瑰。

回复:
user: user-1
content: 不错，画出来的玫瑰很漂亮

user: user-1
content: 先做些简单的，把基础打牢

user: user-2
content: VC中把putpixel 替换成 SetPixel,SetPixelV

user: user-3
content: 引用 7 楼 u012388912 的回复:[quote=引用 6 楼 lm_whales 的回复:] sin cos pow这些都是数学函数 sin cos 这是三角函数，pow数幂函数，这些任意一本C，C++课本就可以查到。 先不忙写程序，先学习一下，C,C++ 这二者的任意一种语言。  ……我这的教材是VC 根本没有讲到sin和cos 我只是不懂这些函数在绘图上的意思。。。   我还是去图书馆找下TC的书吧。。。[/quote]看下基础的书吧

user: user-0
content: 引用 6 楼 lm_whales 的回复:sin cos pow这些都是数学函数 sin cos 这是三角函数，pow数幂函数，这些任意一本C，C++课本就可以查到。 先不忙写程序，先学习一下，C,C++ 这二者的任意一种语言。  ……我这的教材是VC 根本没有讲到sin和cos 我只是不懂这些函数在绘图上的意思。。。   我还是去图书馆找下TC的书吧。。。

user: user-2
content: sin cos pow这些都是数学函数 sin cos 这是三角函数，pow数幂函数，这些任意一本C，C++课本就可以查到。 先不忙写程序，先学习一下，C,C++ 这二者的任意一种语言。

user: user-4
content: 引用 4 楼 u012388912 的回复:[quote=引用 1 楼 starytx 的回复:] 大致看了一下，代码都是基本的东西，用到了一些数学函数，pow()，sin等，这些函数搜一下就知道干什么用的。其他基础东西看看书吧  我是不懂 int	rosesize = 500; int	h = -250; 是什么意思 还有各种sin cos pow的意思 这些也百度不到。 而且我没有讲画图的教材。  请问下这些我不懂的东西在讲TC绘图的书上都有吗  那种书上讲的和我用VC编有区别吗？[/quote]这是变量定义，这个就看最基本的c或c++的书。

user: user-0
content: 引用 1 楼 starytx 的回复:大致看了一下，代码都是基本的东西，用到了一些数学函数，pow()，sin等，这些函数搜一下就知道干什么用的。其他基础东西看看书吧  我是不懂 int	rosesize = 500; int	h = -250; 是什么意思 还有各种sin cos pow的意思 这些也百度不到。 而且我没有讲画图的教材。  请问下这些我不懂的东西在讲TC绘图的书上都有吗  那种书上讲的和我用VC编有区别吗？

user: user-5
content: 可能是用到了一些系统函数，所以你看着有点困难，把那些系统函数搜一下，看下功能，其他没什么难以理解的了

user: user-6
content: 看着不是很难，就是费点时间

user: user-4
content: 大致看了一下，代码都是基本的东西，用到了一些数学函数，pow()，sin等，这些函数搜一下就知道干什么用的。其他基础东西看看书吧
user-0 提问: 关于返回char指针的函数

回复:
user: user-0
content: 有没有哪位可以说明一下最适合返回指针类型函数的应用场景？ 或者这么问:我想利用某个函数构造一个字符串，函数的形参是一些构建字符串的辅助数据， 最后返回这个串的首地址，常用的方法有哪些？

user: user-1
content: 返回局部变量。结果不可预知...

user: user-2
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: 引用 楼主 zhao286 的回复:1.下面函数返回的局部变量str数组的地址，所以在调用的地方打印乱码是可以理解的。    不理解的是，为什么重复调用后，都会正常显示。    而且我在调用的地方用一个char指针接收sub_int函数返回值竟然也等于返回时pch的值，不理解。   char *sub_int(int x,int y) { 	char str[256]; 	char *pch = str; 	memset(str,0,sizeof(str)); 	snprintf(str,sizeof(str),"sub_int(%d,%d)",x,y);  	return pch; }  2.main函数  int main() { 	int x,y; 	x=5; 	y=2; 	printf("%s\n",add_int(x,y)); 	printf("%s\n",add_int(x,y));  	return 0; }  3.运行结果第一行乱码，之后都正常显示： ??$! add_int(5,2)  返回局部指针地址是危险的！因为它的生命周期到函数调用结束也就结束了！ 返回偶尔能获取到有效数据，只是说明数据没有及时擦除而已！但是结果还是不可预知的！

user: user-4
content: 打印出来只是碰巧

user: user-5
content: char str[size]; 这个问题取决于你的size是多少 要深入考虑你这个char str申请的空间在哪了 怎么存的连续的？ 局部变量的数组 str的内存存放 什么时候会释放 什么时候不释放 当size为一定值时 可能出现三种都打印 三种都不打印 乱码等可能

user: user-6
content: 栈内的数据随时可以被改变，这样做是不可预料的，只是碰巧有正确的结果而已，深究下去没有意义。   引用 楼主 zhao286 的回复:1.下面函数返回的局部变量str数组的地址，所以在调用的地方打印乱码是可以理解的。    不理解的是，为什么重复调用后，都会正常显示。    而且我在调用的地方用一个char指针接收sub_int函数返回值竟然也等于返回时pch的值，不理解。   char *sub_int(int x,int y) { 	char str[256]; 	char *pch = str; 	memset(str,0,sizeof(str)); 	snprintf(str,sizeof(str),"sub_int(%d,%d)",x,y);  	return pch; }  2.main函数  int main() { 	int x,y; 	x=5; 	y=2; 	printf("%s\n",add_int(x,y)); 	printf("%s\n",add_int(x,y));  	return 0; }  3.运行结果第一行乱码，之后都正常显示： ??$! add_int(5,2)

user: user-7
content: 返回局部变量的内存地址，只要以后这块内存系统不占用，那里面的值就不会改变，你第一行返回了乱码，说明在函数返回后系统占用了这块内存，改变了里面的值，之后正常显示，则系统一直没有占用，但无法保证在将来的某个时刻不占用。   其实函数返回局部变量的地址没有什么不可，它属于进程地址空间中的合法内存，因此我们可以放心的使用，之所以不提倡这样做，是因为我们不知道系统何时会占用这块内存并导致里面的值改变，
user-0 提问: 我的问题

回复:
user: user-1
content: 计算机语言有什么本质的共同点吗 实现逃不出冯诺依曼结构  计算机语言未来的总发展方向是什么 声明式（DSL和函数式） 动态 并发 这是C#（Turbo Pascal）之父的总结，可以参考，详见： http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html  对语言感兴趣，可以看看 Concepts of Programming Languages Programming Language Concepts 这样的书

user: user-2
content: 两个c语言都解决不了！  自己多注意IT方向的动态就好了！

user: user-3
content: 都是工具 都是逻辑规约

user: user-4
content: 图灵机
user-0 提问: 弱弱的问一个问题

回复:
user: user-1
content: c语言版 数据结构！

user: user-2
content: 《数据结构与算法分析 -C语言描述》

user: user-3
content: 视频0清华大学 数据结构 严蔚敏 书籍呢 其实任何一本数据结构的书都是很好的 我不记得我看过哪本书了 数据结构学习 主要是自己的逻辑思维 把书上的视频的 在你脑子你过个无数遍 你脑袋会变得越来越快 剩下的我就没怎么用过太多 关键是处理一个问题的逻辑处理模型  数据结构最终目的不是学它们的 而是可以自己在脑海里很快创建 只属于你自己的 不好解释 至少有一天你会感觉到的

user: user-4
content: 《算法导论》

user: user-5
content: 为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
user-0 提问: C语言---菜鸟求助！！！！！

回复:
user: user-1
content: 看着你的排序方法不像冒泡哦，但你想用冒泡的排序方法。 可以看一下三楼的冒泡排序

user: user-2
content: 在值传递方式中，在说明和定义函数时，要在数组参数的尾部加上一对方括号([])，调用函数时只需将数组的地址(即数组名)传递给函数

user: user-3
content: #include<stdio.h> #define n 10  void sort(int score[n]); int main() { 	int i; 	int score[n]; 	printf("please enter the score:"); 	for (i = 0; i<n; i++) 	{ 		scanf("%d", &score[i]); 	} 	sort(score); 	printf("the result is:"); 	for (i = 0; i<n; i++) 	{ 		printf("%d,%d\n", i, score[i]); 	} 	return 0; } void sort(int a[n]) { 	int i, j, term; 	for (i = 0; i<n; i++) 	{ 		for (j = i + 1; j<n; j++) 		{ 			if (a[j]<a[i]) 			{ 				term = a[j]; 				a[j] = a[i]; 				a[i] = term; 			} 		} 	} }

user: user-4
content: 有何问题？？？？

user: user-5
content: 稍微修改了一下啊  #include <stdio.h> #define n 10  void my_sort(int *a); // n定义了宏，可以不需要传参数了的 int main() {     int i;     int score[n];     printf("please enter the score: \n");     for (i = 0; i<n; i++)     {            scanf("%d", &score[i]);         getchar(); // 吃掉每次输入的回车符     }        my_sort(score);     printf("the result is:\n");     for (i = 0; i<n; i++)     {            printf("%d,%d\n", i, score[i]);     }    } void my_sort( int *a)  {     int i, j , temp;     for(i =0; i< n ;i ++)      {            for(j =0 ; j < n-i-1; j++)         {                if( a[j] > a[j+1])             {                    temp = a[j];                 a[j] = a[j+1];                 a[j+1] = temp;             }            }        }    }

user: user-5
content: 引用 4 楼 u012848622 的回复:二楼跟三楼的代码都行，可我就讷闷了，我的怎么就不行了呢？百思不得其解。我感觉我的代码跟楼上的两位基本一样。 你函数形参写的有问题啊，void sort(int score[n],int n)；大小n，这样是不行的 数组作参数传递的时候和指针是一样的！ 下面的几个试试 void sort(int score[],int n)； void sort(int *score,int n)

user: user-3
content: 引用 4 楼 u012848622 的回复:二楼跟三楼的代码都行，可我就讷闷了，我的怎么就不行了呢？百思不得其解。我感觉我的代码跟楼上的两位基本一样。  正因为基本一样才帮你改改。要是基本都不行那就懒得理你了。

user: user-0
content: 二楼跟三楼的代码都行，可我就讷闷了，我的怎么就不行了呢？百思不得其解。我感觉我的代码跟楼上的两位基本一样。
user-0 提问: C语言继续求

回复:
user: user-1
content: 引用 1 楼 u012407856 的回复:求大神救援，新人不懂事 http://download.csdn.net/detail/n_sev7/3610885   学生成绩管理系统

user: user-2
content: 这个题目网上到处都是，好好看看书

user: user-0
content: 求大神救援，新人不懂事