Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 不理解主机字节序转换为网络字节序的代码

回复:
user: user-1
content: 你的代码假设主机是小端字节序

user: user-2
content: 单步调试这句代码

user: user-3
content: 就是说字节顺序有规定。

user: user-4
content: 只有小端机器才需要使用该转换，交换高低字节。 网络字节顺序采用大端排序方式，也就是低字节存高地址，高字节存低地址 如果你的机子是大端的，就无需转换了
user-0 提问: 新手求助：C Primer Plus书中高级数据一章中抽象数据类型（ADT）的问题

回复:
user: user-0
content: 为啥回复不了呢...请问楼上的童鞋，我看的是C Primer Plus中文版第五版的，书上确实是按照我上面那种写法来的。我还一直想不懂呢，你的书上没有我说的问题么？ListIsEmpty(&movies)中的实参也是二级指针是吧？

user: user-1
content: 不知道是否是看错了，我看原文里写的是/* display          */      if (ListIsEmpty(&movies))          printf("No data entered. ");      else      {          printf ("Here is the movie list:\n");          Traverse(&movies, showmovies);      }      printf("You entered %d movies.\n", ListItemCount(&movies));    照你所写，肯定会报一个warning类型不匹配。

user: user-2
content: 你的问题问得很好，照书本的代码输入计算机编译一下看看能不能编译通过就知道了。
user-0 提问: 新手求助C语言free()问题

回复:
user: user-1
content: 我不是大神诶，我理解的free就是系统把指针指向的那一块内存拿回去。 举个例子，我malloc了一块内存a给p，此时p指向a，就相当于宣布了a是p的，系统你不能再分配给别人了。之后你free它，p仍然指向a，但是它已经没有所有权了，系统想把a给谁就给谁。 这里就有个问题，free了p，p没有置NULL，还是指向a，但是系统已经把a作为b的一部分给了q，好乱啊，这是再引用p，系统也凌乱了，于是就出现野指针的问题了。

user: user-2
content: free一块内存，有点像从硬盘上删除一个文件。操作系统只是把那块空间标记为可用，但不会主动修改其中的内容。这个文件被删除之后，还有可能恢复，取决于操作系统有没有在那块空间写入其他的文件。

user: user-2
content: free(current); current = current->next; // 这么写是不对的。current虽然还指向原来的位置，但是内容有可能被覆盖。 这段代码可以这么改：         current =head; while (current != NULL) { tmp = current;                 free(current); current = tmp->next; }

user: user-3
content: 1current是一个指针变量，你不显式改变，它的值是不会变的，永远指向某块内存。 2free是释放某块内存给系统，就是告诉系统，这块内存还给你，但系统不一定马上就用它。 3如果系统用了释放的内存，那这块内存的值就会改变，像你的例子中，free之后，current指向的内存块就还给系统了，会被系统使用，如果这时有其它线程申请内存，有可能就会申请到current指向的内存，也可能会更改它的成员next，使next的值不再是之前的值。这样current->next就不知道是什么东西了。

user: user-4
content: free 可以看做是向os申请 自己放弃了这个内存的使用。  因此，free之后，不对current进行赋值， current是继续指向 原来那个内存。  只有这个内存没有被分配给其它进程，他可能继续保留着原来的数据。  话说，你修改后的版本没有内存释放哦

user: user-2
content: free的意思是，这块内存我用完了，还给你。系统不会马上动手改动其中的内容，但是有可能把它分配给别人用。 current仍然指向原来的内存单元，因为你没有改变它的值。但是，如果那块内存分配给别人用了，他就可能被覆盖。如果没有分配给别人用，内容就不变。
user-0 提问: 我的TURBO C为什么SCANF不暂停？

回复:
user: user-1
content: 因为楼主从来不会判断scanf函数的返回值！

user: user-2
content: scanf的格式字符串里出现什么字符，你输入的时候就得输入什么字符，才能匹配。你用了逗号，就必须输入逗号。 如果想输入时按回车，把逗号去掉或者换成空格。

user: user-0
content: 问题解决了，其实不用回车，用逗号分隔数字就行了

user: user-0
content: 我根本就没有输入464啊，这个数字式怎么回事？每次按回车这个界面都消失了，根本无法输入下一个数字

user: user-0
content: 还有为什么每次都出现一个464？每次只能输入一个数字，和464比较，我汗啊，这是怎么回事？
user-0 提问: 如何在shell同一位置处输出数据？

回复:
user: user-1
content: 使用NCURSES库。

user: user-2
content: works g++ 4.7 in ubuntu #include <iostream> #include <iomanip> #include <unistd.h>  int main() {   std::cerr << "in progress:00%" << std::setfill('0');   for (int i = 0; i < 100; i++) {     std::cerr << "\b\b\b" << std::setw(2) << i << "%";     sleep(1);   }   std::cerr << std::endl;   return 0; }

user: user-3
content: printf("progress: %3d%%", 0);   for (i = 1; i <= 100; i++) {     fflush(stdout);     sleep(1);     printf("\b\b\b\b%3d%%", i);   }

user: user-3
content: for (i = 0; i < 100; i++) {     printf("\rprogress: %d%%", i);     fflush(stdout);     sleep(1);   }

user: user-4
content: 用 VT100 的控制字符, 比如 "\\033[2J" 是清屏,  "\\33[nD" 是光标左移 n 位,  "\\033[K"是清除光标位置到行尾的字符, "\\33[y;xH" 是设置光标位置..
user-0 提问: CVI如何设置程序图标？

回复:
user: user-1
content: Build->Target Settings

user: user-0
content: National Instruments CVI应该支持这样的API接口才对，但在网上没查找到对应的接口。了解的盆友麻烦帮忙告我一声。

user: user-2
content: 使用exeScope软件修改exe文件的图标。

user: user-3
content: windows平台可以用api设置图标吧。

user: user-0
content: 呵呵，感谢赵4老师指点。不过我想知道的是CVI编译环境中是如何设置程序图标的，了解的盆友麻烦帮忙告我一声。
user-0 提问: C语言 size_t到底是个什么东东？

回复:
user: user-1
content: unsigned int

user: user-2
content: 无符号整型。

user: user-3
content: 这是在不同的机器里面的的头文件定义的相应宏定义，实际上是unsigned int。

user: user-4
content: 有一说法，数组下标应为size_t类型，具体size_t占几个字节与具体环境有关

user: user-5
content: 大部分情况下是unsigned int

user: user-6
content: According to the 1999 ISO C standard (C99), size_t is an unsigned integer type of at least 16 bit (see sections 7.17 and 7.18.3).

user: user-7
content: <cstddef> <cstdio> <cstdlib> <cstring> <ctime> <cwchar> size_t Unsigned integral type Alias of one of the fundamental unsigned integer types.  It is a type able to represent the size of any object in bytes: size_t is the type returned by the sizeof operator and is widely used in the standard library to represent sizes and counts.

user: user-8
content: 简单理解为 unsigned int就可以了
user-0 提问: 关于watcom c 的一篇文章————转帖

回复:
user: user-0
content: 比如目录下有test.c文件，在命令行用wcl test命令，在源程序没有错误的情况下就可以编译出test.exe文件了

user: user-0
content: 我电脑上的autoexec.bat批处理文件是这样的： PATH \WATCOM\BINW;%PATH%; SET INCLUDE=\WATCOM\H; SET WATCOM=\WATCOM SET EDPATH=\WATCOM\EDDAT SET WIPFC=\WATCOM\WIPFC 运行这个批处理文件以后就可以用wcl命令编译文件了

user: user-1
user-0 提问: 调用iomarkirppending的一个问题

回复:
user: user-1
content: 你跟踪下Irp->PendingReturned是在哪置位的，想来iocompleterequest这个函数定然不全如函数名那般为IRP处理 全部后事，如果有置位还需要其它操作
user-0 提问: 关于静态变量的问题

回复:
user: user-1
content: 静态变量的作用域在函数内，生命期和全局变量相同。

user: user-0
content: 问题已解决 有两种方法 第一种方法是将face.c中原本为局部静态变量的ID改为具有内部链接的全局变量 然后再face.c中写一个自定义函数 FaceIDReset（） {         ID=0； } 然后再在Facelist.c的for循环前面调用该函数即可完成清零  方法二 在facelist.c中，声明ID为全局变量 在for循环前面加一句ID=0； 然后在face.c中使用extern声明ID变量 使得FaceNeW中的f->faceno=ID++能够进行

user: user-2
content: 这是静态变量的定义方式决定你过得  可以定义为 static int id； id=0； 便不会在累加

user: user-0
content: 问题已经解决了

user: user-0
content: 如果有这么简单的话   我就不会发帖子了

user: user-0
content: 清不了的   试过了   没用

user: user-3
content: 一次for循环后把ID清零不就行了吗
user-0 提问: 链表问题

回复:
user: user-0
content: 恩  正解  谢谢

user: user-1
content: bool Make_LNode(LNode **q) {     (*q)=(LNode *)malloc(sizeof(LNode));     if(!(*q))     {         printf("分配内存失败\n");         exit(-1);     } //    *q->next=NULL;           return true; }

user: user-1
content: bool append_LinkList(LinkList q,int x) {     LNode * pa;     Make_LNode(pa);     // 这里的Make_LNode函数参数有问题，pa是临时变量，在里面申请的内存与pa无关，返回后，pa并不是指向一个有效的内存       //    printf("---1\n");           LinkList p=q;     while(p->next != NULL)     {         p=p->next;     }     p->next=pa;     pa->data=x;     pa->next=NULL; //    p=pa;            print_LinkList(q);           return true;       }
user-0 提问: VS2010 fopen函数打开不了目标文件

回复:
user: user-1
content: _chdir, _wchdir Change the current working directory.  int _chdir( const char *dirname );  int _wchdir( const wchar_t *dirname );  Routine Required Header Optional Headers Compatibility  _chdir <direct.h> <errno.h> Win 95, Win NT  _wchdir <direct.h> or <wchar.h> <errno.h> Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  Each of these functions returns a value of 0 if successful. A return value of –1 indicates that the specified path could not be found, in which case errno is set to ENOENT.  Parameter  dirname  Path of new working directory  Remarks  The _chdir function changes the current working directory to the directory specified by dirname. The dirname parameter must refer to an existing directory. This function can change the current working directory on any drive and if a new drive letter is specified in dirname, the default drive letter will be changed as well. For example, if A is the default drive letter and \BIN is the current working directory, the following call changes the current working directory for drive C and establishes C as the new default drive:  _chdir("c:\\temp");  When you use the optional backslash character (\) in paths, you must place two backslashes (\\) in a C string literal to represent a single backslash (\).  _wchdir is a wide-character version of _chdir; the dirname argument to _wchdir is a wide-character string. _wchdir and _chdir behave identically otherwise.  Generic-Text Routine Mapping:  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tchdir _chdir _chdir _wchdir    Example  /* CHGDIR.C: This program uses the _chdir function to verify  * that a given directory exists.  */  #include <direct.h> #include <stdio.h> #include <stdlib.h>  void main( int argc, char *argv[] ) {    if( _chdir( argv[1] )   )       printf( "Unable to locate the directory: %s\n", argv[1] );    else       system( "dir *.wri"); }   Output   Volume in drive C is CDRIVE  Volume Serial Number is 0E17-1702   Directory of C:\write  04/21/95  01:06p                 3,200 ERRATA.WRI 04/21/95  01:06p                 2,816 README.WRI                2 File(s)          6,016 bytes                              71,432,116 bytes free   Directory Control Routines  See Also   _mkdir, _rmdir, system

user: user-2
content: 你这两个程序是在同一个目录下么？ 前面把dat文件写在某个目录下，后面在另一个目录下找肯定找不到

user: user-3
content: 是文件打开模式出问题了。文件不存在时，一些模式是无法打开文件的。搜索fopen参数自己看一下各个模式的意义。

user: user-4
content: 打印出lasterror信息

user: user-5
content: 文件打开模式错误，rb指的是读取二进制文件，改成ab或者wb就可以
user-0 提问: 求助，知道这个函数的，可以帮忙解答一下吗

回复:
user: user-1
content: 这里应是串口通信的一部分，BspTim3SetIRQCallBack这个函数注册回调函数IRQHandler，你查下IRQHandler应是在串口中断 那调用，m_ReceData的buff里放的应是串口通信的内容，这个回调函数将串口通信内容回传 Tim3SetIRQCallBack(TimEndHandle); 这么调用就是将中断回调函数设置为TimEndHandle函数指针了 楼主可以打印看下TimEndHandle什么时候调用，调用后m_ReceData的buffer和len,ind填充了些什么
user-0 提问: 求助链表显示 的问题

回复:
user: user-1
content: s = s->next;  如果传进来的参数s是NULL就会出问题。 对于用头节点保存数据的链表，如果没有数据，那么头节点就是NULL。 对于头节点不保存数据的链表，应该是在创建任何链表的时候(即使没有数据)都有一个非NULL的头节点。

user: user-1
content: 这要看链表是怎么创建的。 我见过有些人的链表头节点不放数据，从第二个节点才开始保存数据。我没这么做过，我感觉大多数的链表都不是这样的。

user: user-2
content: 主要看所创建的链表的头结点，如果头结点没有存放数据，就是说链表是从第二个人结点开始存放数据时，打印就需要先让s = s->next;
user-0 提问: 请问下回调函数的原理是什么？

回复:
user: user-1
content: 这是什么情况......

user: user-2
content: 引用 10 楼 stupid_boy2007 的回复:老子7年前学Ｃ语言函数指针时，就理解回调了，你他吗这么多年是吃屎去了吗？ 操你大爷的，还给我取ID, king_2007,你是不是吃屎大王？  虽然骂人不对,但是问题说的对的,一般人学了函数指针就明白回调了

user: user-3

user: user-3
content: 参考Microsoft SDK\src\crt\qsort.c

user: user-0
content: 引用 11 楼 stupid_boy2007 的回复:还在csdn装鸟，老子的思考的问题和你不是一个层次的，傻鸟你懂吗？你有神经病，我不跟你计较。

user: user-4
content: 说原理，回调函数跟goto是一样的原理 就是地址的跳转

user: user-5
content: 这个。。。。。。又有私人恩怨

user: user-6
content: 老子7年前学Ｃ语言函数指针时，就理解回调了，你他吗这么多年是吃屎去了吗？ 操你大爷的，还给我取ID, king_2007,你是不是吃屎大王？

user: user-6
content: 你他吗个傻屌，回调都不知道，还装Ｂ干过多年程序。不丢你祖宗的脸吗？ 还给我私信说， “傻逼，还在我的帖子里卖弄的代码，老子当程序员的时候，你还在玩泥巴呢！” 这不是丢你祖宗的脸吗？

user: user-0
content: 引用 5 楼 lambda2007 的回复:#include <iostream> #include <vector>  using namespace std;  float fun_type1(float a, int b) {     return a + b; }   float fun_type2(float a, int b) {     return a + b * 100.0f; }  typedef  float (*FUN_TYPE)(float a, int b);  float use_fun_type(FUN_TYPE fun_type) {     float sum = 1.25f * fun_type(1.2f, 10);     return sum; }  int main() {     cout << use_fun_type(fun_type1) << endl;     cout << use_fun_type(fun_type2) << endl;     return 0; }  即把函数当参数来用。能不能用c语言，不是c++!哥们你弄懂了语言没有？？

user: user-7
content: 引用 4 楼 king_2007 的回复:引用 1 楼 fsy351 的回复:简单的讲，回调就是以函数为参数实现动态调用方式。比如A，B两个函数，main函数执行过程中调用A，A的参数包括一个B类型的函数！能不能用代码实例来解释你的这句话？？ 这个网上很多的！！5楼正解！！

user: user-8
content: #include <iostream> #include <vector>  using namespace std;  float fun_type1(float a, int b) {     return a + b; } float fun_type2(float a, int b) {     return a + b * 100.0f; }  typedef  float (*FUN_TYPE)(float a, int b);  float use_fun_type(FUN_TYPE fun_type) {     float sum = 1.25f * fun_type(1.2f, 10);     return sum; }  int main() {     cout << use_fun_type(fun_type1) << endl;     cout << use_fun_type(fun_type2) << endl;     return 0; }  即把函数当参数来用。

user: user-0
content: 引用 1 楼 fsy351 的回复:简单的讲，回调就是以函数为参数实现动态调用方式。比如A，B两个函数，main函数执行过程中调用A，A的参数包括一个B类型的函数！能不能用代码实例来解释你的这句话？？

user: user-0
content: 请问下，有没有代码例子给解释下，我就理解的更好了！另外想问下int winapi winmain()函数中的winapi是什么？？？它起什么作用？

user: user-9
content: 调用一个函数，编译器会把函回调函数数名转换成函数的入口地址。这可以看成函数地址常量。如果把这个函数地址保存到参数中，再调用，就是回调函数

user: user-7
content: 简单的讲，回调就是以函数为参数实现动态调用方式。比如A，B两个函数，main函数执行过程中调用A，A的参数包括一个B类型的函数！
user-0 提问: 快速排序，写了一个快排的算法，但是发现根本就没作用啊~~求救

回复:
user: user-0
content: 引用 4 楼 u012421456 的回复:在Qsort函数中数组a传过来的可以说是一个指针，占四个字节 问题多多啊！ 建议先参考一下别人的吧——http://blog.sina.com.cn/s/blog_6d3488c30100ogdt.html 3Q多多学习~

user: user-0
content: 引用 2 楼 Bokutake 的回复:有些书里说C可以按值(by value)和按地址(by address)传递数组，其实是不对的，不管形参声明成数组还是指针，在函数内部，编译器始终把它当作一个指向数组第一个元素的指针。 所以如果想用 sizeof()来获取数组的长度，所得结果只能是指针的长度。 你只能用额外的参数传递数组的大小。 非常感谢~找到问题了~见笑了……

user: user-0
content: 引用 3 楼 tal_he 的回复:sizeof(a)/sizeof(a[0])-1;   这个表达式的值 你自己想想等于多少 谢谢~找到问题了~  非常感谢~~自己很水~让大家见笑了~~

user: user-1
content: 在Qsort函数中数组a传过来的可以说是一个指针，占四个字节 问题多多啊！ 建议先参考一下别人的吧——http://blog.sina.com.cn/s/blog_6d3488c30100ogdt.html

user: user-2
content: sizeof(a)/sizeof(a[0])-1;   这个表达式的值 你自己想想等于多少

user: user-3
content: 有些书里说C可以按值(by value)和按地址(by address)传递数组，其实是不对的，不管形参声明成数组还是指针，在函数内部，编译器始终把它当作一个指向数组第一个元素的指针。 所以如果想用 sizeof()来获取数组的长度，所得结果只能是指针的长度。 你只能用额外的参数传递数组的大小。
user-0 提问: 关于数组溢出的问题

回复:
user: user-0
content: 谢谢   赵4老师

user: user-1
content: 判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-0
content: 完整代码四五千行吧

user: user-2
content: 你能把代码写在代码框里面吗，注释太多了也不好啊

user: user-0
content: 问题已解决 有两种方法 第一种方法是将face.c中原本为局部静态变量的ID改为具有内部链接的全局变量 然后再face.c中写一个自定义函数 FaceIDReset（） {         ID=0； } 然后再在Facelist.c的for循环前面调用该函数即可完成清零  方法二 在facelist.c中，声明ID为全局变量 在for循环前面加一句ID=0； 然后在face.c中使用extern声明ID变量 使得FaceNeW中的f->faceno=ID++能够进行

user: user-3
content: 请贴完整代码

user: user-0
content: 已经发现了数组溢出是因为ID是一个局部静态变量，第一次循环之后，ID的值任然保留，而f->faceno=ID++；所以f->faceno是从上一次的ID的值开始的，所以后面导致数组溢出。 所以我想问 有没有办法能够使得ID这样一个局部静态变量在第二次循环的时候清零， 再或者不把ID定义为局部静态变量。 for循环在facelist.c这个文件夹中，而f->faceno=ID++在face.c这样一个文件夹中 我的设想是在for循环前面对ID清零，因为ID是跨文件使用，所以他需要定义为全局变量，在两个.c文件中都能使用

user: user-3
content: 那没折了，你单步吧，可以在for那写个if (faoceno == 455)，在这个if后下断点，看是怎么溢出的 可能链表没创建好

user: user-0
content: 大神在哪里？

user: user-0
content: 很奇怪  为什么第二次循环会在第一次循环的基础上继续 有大神知道吗？

user: user-0
content: 没那么复杂   前面的可以不看 就是能不能让我第二次循环不接着第一次来 就可以了 上学期学了C语言，垃圾老师60个学时连数组都没讲完，

user: user-4
content: 不明觉厉 = =

user: user-0
content: 这个该怎么从0开始
user-0 提问: c语言 编写下面的方程组  如何实现呢？？

回复:
user: user-0
content: 如果用fmod（）在判断语句中控制也     double gg; 	int ggg; 	gg=2*10*pi/wh; 	if(fmod(t,gg)==0) 	ggg=1; 	else 	ggg=0; 	return (ggg); 也会出现循环次数越多   输出越不精确

user: user-0
content: 如果循环次数越大  强制转换后  最后在整数倍的时候输出的也是0

user: user-0
content: 强制转换的话  会出现精度不够精确

user: user-1
content: 这个貌似不难啊

user: user-2
content: [quote=引用 2 楼 u012412689 的回复:] #include<stdio.h> int main() { 	int g; 	float t,p,r; 	int x=t/(2*p/r)/10-(int)t/(2*p/r)/10; 	if (x=0) 		g=1; 	else g=0; 	return 0; }  楼上的方法不对，不管怎么样，因为浮点到整型的强制转换总是会丢掉小数部分。 此外计算机的浮点数无法精确表示十进制整数，所以那个除法有可能会产生0.0000....1之类的尾巴。正确的方式应该是x也用浮点类型，并且将其绝对值和一个极小数（float是1e-5，double是1e-9）进行比较。

user: user-3
content: #include<stdio.h> int main() { 	int g; 	float t,p,r; 	int x=t/(2*p/r)/10-(int)t/(2*p/r)/10; 	if (x=0) 		g=1; 	else g=0; 	return 0; }  将本来的数减去强制转换为int的数，如果为0则为整数

user: user-4
content: if else
user-0 提问: 想要一直等待输入一个值又想要同时执行其他代码怎么做？windows下的C语言编程

回复:
user: user-1
content: while(1) { if(scanf(...)!=0) f1(); f1(); } 消息循环 switch(message) { case x: do something; case y: do something; default do something }

user: user-2
content: 玩得转的。自己控制消息循环就行了。  引用 1 楼 u013797412 的回复:你该去学 窗口 和 多线程了 亲 黑屏程序 已然玩不转了......

user: user-3
content: 用多线程。。。

user: user-0
content: 引用 1 楼 u013797412 的回复:你该去学 窗口 和 多线程了 亲 黑屏程序 已然玩不转了...... 可是老师让我们用控制台写。。。

user: user-4
content: 你该去学 窗口 和 多线程了 亲 黑屏程序 已然玩不转了......
user-0 提问: 关于malloc的问题

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

user: user-2
content: 引用 9 楼 zhaozhaohelu 的回复:[quote=引用 8 楼 r_Jimy 的回复:] [quote=引用 7 楼 zhaozhaohelu 的回复:] 我弱弱地问一下，int * pArr = (int *)malloc(sizeof(int) * length); 这不能写成int * pArr = (int *)malloc(sizeof(length)); 么？直观地反映你申请了多少内存。。。菜鸟回答！见谅。 不能，sizeof(length)是固定大小为4，起不到申请动态数组的作用 另外，动态申请内存要增加if (NULL == pArr)的申请失败判断[/quote]其实既然知道了长度，那么可以不写sizeof的吧。malloc的参数就添length[/quote]但在某些编译器里int所占的字节数不同

user: user-3
content: 用sizeof的话，如果以后需要移植的时候，就不需要修改代码了。另外，写死的话，也应该是length*4

user: user-4
content: 引用 8 楼 r_Jimy 的回复:[quote=引用 7 楼 zhaozhaohelu 的回复:] 我弱弱地问一下，int * pArr = (int *)malloc(sizeof(int) * length); 这不能写成int * pArr = (int *)malloc(sizeof(length)); 么？直观地反映你申请了多少内存。。。菜鸟回答！见谅。 不能，sizeof(length)是固定大小为4，起不到申请动态数组的作用 另外，动态申请内存要增加if (NULL == pArr)的申请失败判断[/quote]其实既然知道了长度，那么可以不写sizeof的吧。malloc的参数就添length

user: user-5
content: 引用 7 楼 zhaozhaohelu 的回复:我弱弱地问一下，int * pArr = (int *)malloc(sizeof(int) * length); 这不能写成int * pArr = (int *)malloc(sizeof(length)); 么？直观地反映你申请了多少内存。。。菜鸟回答！见谅。 不能，sizeof(length)是固定大小为4，起不到申请动态数组的作用 另外，动态申请内存要增加if (NULL == pArr)的申请失败判断

user: user-0
content: 我找到答案了 length那里少了个&

user: user-4
content: 我弱弱地问一下，int * pArr = (int *)malloc(sizeof(int) * length); 这不能写成int * pArr = (int *)malloc(sizeof(length)); 么？直观地反映你申请了多少内存。。。菜鸟回答！见谅。

user: user-6
content: scanf("%d",&length);

user: user-7
content: 作用域那个，的确建议你修改。之所以没问题是因为在VC 6.0的一个不标准的地方，即使即使变量声明在for语句里，其作用域却是外面一层的。

user: user-8
content: 呵呵  有的时候自己怎么看自己写的代码都对， 可就是有错误还找不到，最好就是先放下，休息一会，再看，很有可能找到问题~~~而且一般是些小问题，例如：输入错误，少了符号，或者多了符号，甚至大小写错误~~~~

user: user-9
content: 有两个错误 1.你的变量i的作用于只在第一个for循环中，第二个for循环中的i时没有定义的。最好把i在main里面for外面定义； 2.scanf函数里面length前面少了&。 暂时只发现这两个，应该没有其他问题了

user: user-10
content: 除了以上的问题之外，好像你的i的作用域有点问题，
user-0 提问: 求大神帮忙看看哪里错了，为什么错了

回复:
user: user-1
content: 沒有錯誤阿........

user: user-2
content: 引用 5 楼 liu15073458538 的回复:请问这个在什么软件上编译的@r_Jimy dev c++

user: user-2
content: 楼主以后注意代码缩进，以下供楼主参考：  #include<stdio.h> #include<string.h>  char str[1000];  int main() { 	int num=0; 	int i = 0;//兼容C99前的标准，不在for内定义变量  	int j = 0; 	int  index = 0;//用index代替strlen提高效率  			 	scanf("%d",&num); 	fflush(stdin); 	 	for(i=0;i<num;i++) 	{ 		char s[101]={0};//局部变量应初始化  		int  size = sizeof(s); 		         //gets(s);         if (NULL == fgets((char*)s,size,stdin))         {         	printf("can't read!\r\n");         	continue;         }                  printf("we get:%s\n",s);                  s[100]='\0';//防止溢出                   for(j=0;j<strlen(s)&&index<sizeof(str)-1;j++)//防止str溢出  		{ 			if(s[j]>='A'&&s[j]<='Z') 			{ 				s[j]+=32; 				str[index]=s[j]; 				index++; 			} 			else if(s[j]>='a'&&s[j]<='z') 			{ 				s[j]-=32; 				str[index]=s[j]; 				index++; 			} 		} 	 	str[index]='#'; 	 	index++; 	} 	 	for(i=0;i<index;i++) 	{ 		if(str[i]!='#'&&str[i]>='A'&&str[i]<='z') 		{ 			printf("%c",str[i]); 		} 		else if(str[i]=='#')         {             printf("\n");         } 	} 	 	return 0; }

user: user-3
content: 楼主觉得前三楼的问题不值得回复？我也有此疑问，不知楼主回不回

user: user-4
content: prog.c:12:1: error: ‘for’ loop initial declarations are only allowed in C99 mode  for(int i=0;i<num;i++) 你是说这种错误吗，是编译器版本的问题，是不要在for()里面定义局部变量就是了

user: user-5
content: 请问这个在什么软件上编译的@r_Jimy

user: user-6
content: 有啥错误？？

user: user-7
content: 可以正常运行。问这种题最好把错误提示贴出来

user: user-8
content: 你是想说什么错了？输出正常啊！大写转换小写，或者小写转换大写都OK哦。
user-0 提问: 我是第一次编程啊，求助

回复:
user: user-1
content: 楼主看书了吗？ 楼主需要认真看书

user: user-2
content: 对的对的'，应该将大括号放到最后啊，不把return放到最后它会一直停不下来就出错了

user: user-3
content: return应该放在main函数里面。

user: user-4
content: 认真点

user: user-5
content: 楼上几位正解 可以参照二楼作法

user: user-6
content: include<stdio.h> int main() { int x,y,z,result; printf("please input 3 integers: "); scanf("%d %d %d",&x,&y,&z); result=x*y*z; printf("The result is ",result); return 0; }

user: user-7
content: 二楼正解。。。。

user: user-8
content: 大小写敏感啊

user: user-9
content: 把 return 0; 放到反大括号}里面

user: user-10
content: #include<stdio.h> int main() { int x,y,z,result; printf("please input 3 integers: ");     scanf("%d,%d,%d",&x,&y,&z);     result=x*y*z; printf("The result is %d\n",result); return 0; }

user: user-11
content: return应该放在main函数里面。return如果放在大括号外面的话，你的主函数就没有返回值了。而且还要是return 0； 或者你可以把 int  main改成void main 然后把return去掉
user-0 提问: VS2010 这是什么意思，求解答，如何解决

回复:
user: user-1
content: 枚举不常用，也不要这么用

user: user-2

user: user-3
content: 2楼正解.......

user: user-4
content: 如果你确认自己没错，把源文件的后缀，由.cpp改为.c试试。

user: user-5
content: ++符号不能用于枚举类型 对策 1 写一个++重载函数 支持枚举 -估计比较难  2 把枚举转换成int 后在处理
user-0 提问: 循环 计算圆周率 新手求帮忙

回复:
user: user-1
content: 仅供参考#include <stdio.h> long a=10000; long b; long c=2800; long d; long e; long f[2801]; long g; int main() {     for(;b-c;) f[b++]=a/5; //  while (1) { //      if (0==b-c) break; //      f[b]=a/5; //      b++; //  }      //f[0 - 2800] = 10000/5     for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)           for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); //  while (1) { //      d=0; //      g=c*2; //      if (0==g) break; //      c-=14; //      printf("%.4d",e+d/a); //      e=d%a; //      b=c; //      while (1) { //          d+=f[b]*a; //          f[b]=d%--g; //          d/=g--; //          --b; //          if (0==b) break; //          d*=b; //      } //  }      return 0; }

user: user-2
content: Bigint ?  Python for the task.  Perl for the task.  OpenSSL for the task.  GNU MP (multi-precision) library

user: user-3
content: 楼主要问什么？程序编译不过?运行结果不对？

user: user-4
content: 楼主想问什么

user: user-5
content: #include<stdio.h> int main() { 	double a[50]; 	double f(int, double *); 	double x,pi; 	int n = 0; 	pi = 0.0; 	scanf("%f",&x); 	do 	{ 		n++; 		a[n] = f(n,a); 		pi = pi +a[n]; 	}while(a[n] > x); 	printf("%f", 2 * pi); }  double f(int n, double * a) { 	if(n == 1) return 1.0; 	return a[n -1] * ( n - 1) / (2 * n - 1); } 谁来调试这个烂摊子
user-0 提问: 严&&吴《数据结构 C语言版》例2-4 中算法2-23 一元多项式加法问题

回复:
user: user-0
content: 自己的问题 自己解决吧  代码写的太乱，决定重新规范下代码，没想到，规范了下代码，找到问题了，先贴代码，polynomial AddPolyn(polynomial *p,polynomial *q) { 	polynomial k,ka,pa,qa; 	pa=(*p)->pNext; 	qa=(*q)->pNext; 	ka=k=*p; 	double sum;  	while(pa && qa) 	{ 		switch(comp(pa->data.expn, qa->data.expn)) 		{ 		case -1: 			ka->pNext=pa; 			ka=pa; 			pa=pa->pNext; 			break; 		case 0: 			sum=pa->data.coef+qa->data.coef; 			if(sum != 0.0) 			{			 				ka->pNext=pa; 				pa->data.coef=pa->data.coef + qa->data.coef; 				ka=pa; 				pa=pa->pNext; //				qa=qa->pNext; 			}else{ 				polynomial pb=pa; 				ka->pNext=pa->pNext; 				pa=pa->pNext; 				free(pb); 				pb=NULL; //				qa=qa->pNext; 			} 			qa=qa->pNext; 			break; 		case 1: 			ka->pNext=qa; 			ka=qa; 			qa=qa->pNext; 			break; 		} 		ka->pNext = pa ? pa : qa;   	}  	return k; }  问题出在  原来的代码case -1:                  p1=p0->pNext;                  (p0)=(p0)->pNext; 这样p1并没有连接到p0，而是直接指向了p0->pNext;  从而导致了最后的结果只有  一元多项式的最后一项，前面的项根本就没有连接上
user-0 提问: HDOJ 2010水仙花数求解释，哪里错了。

回复:
user: user-0
content: 引用 2 楼 user-2 的回复:int reNo = 0;     //判断是否输出no     int reSp = 0;    //判断输出空格  要放在while循环里面哦非常感谢~

user: user-1
content: 围观....

user: user-2
content: int reNo = 0;     //判断是否输出no     int reSp = 0;    //判断输出空格  要放在while循环里面哦

user: user-0
content: 求回答啊～～
user-0 提问: 关于codeblocks

回复:
user: user-1
content: 非法字符，就是有些汉字，日文，等等C，C++语言不能识别的字符.... 这些字符， 放在双引号内部作为C，C++字符串，通常没问题 如果作为代码 ，标识符用，通常会出错  出现这种情况，往往都是，从网上复制代码造成的 仔细加查一下，就能找到 找不到，可以查编译后，出错信息所在行号 实在没办法的话，还有最后一招：代码全部手动输入。

user: user-2
content: 建议你不要安装太多的输入法

user: user-3
content: 肯定是字符  每行注释查

user: user-0
content: 我重新换了，还是这个错误，怎么搞的

user: user-0
content: 切换到英文编码是什么意思

user: user-4
content: 还是全角或者中文之类的啦， 比如; %等等， 要么就细心的调， 要么找个编辑器切换到英文编码看看

user: user-5
content: http://www.baidu.com/s?cl=3&wd=Error%3Astray+%27\302%27+in+program+Error%27\240%27+in+program&tn=94820638_hao_pg&lans=132
user-0 提问: 蓝桥杯——李白打酒

回复:
user: user-1
content: //李白街上走，提壶去买酒，遇店加一倍，遇花喝一斗，遇到店5次，遇到花10次，酒壶原来有两斗，最后一滴不剩，且最后遇到的是花，问遇店和花的顺序和有多少可能性   //本题是菜鸟做法，大神慎入 #include <stdio.h> void main() { 	int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,r,s[15],sum,w,t,z=0,v;//定义路上的15次遇到店和花 	 	for(a=1;a<=2;a++) 	for(b=1;b<=2;b++) 	for(c=1;c<=2;c++) 	for(d=1;d<=2;d++) 	for(e=1;e<=2;e++) 	for(f=1;f<=2;f++) 	for(g=1;g<=2;g++)               //每次都有两种可能性共有十五次，2代表遇到店，1代表遇到花 	for(h=1;h<=2;h++) 	for(i=1;i<=2;i++) 	for(j=1;j<=2;j++) 	for(k=1;k<=2;k++) 	for(l=1;l<=2;l++) 	for(m=1;m<=2;m++) 	for(n=1;n<=2;n++)    	{ 		s[0]=a; 		s[1]=b; 		s[2]=c; 		s[3]=d; 		s[4]=e; 		s[5]=f; 		s[6]=g; 		s[7]=h; 		s[8]=i;                //将每一种可能性都先放在s[]里 		s[9]=j; 		s[10]=k; 		s[11]=l; 		s[12]=m; 		s[13]=n; 		s[14]=1;            		 		sum=0; //每次循环初始化 		for(v=0;v<15;v++) 			sum=sum+s[v];		//求和  		 		if(sum==20)//筛选出遇到5次店面和10次花，恒等于20  		{ 			 			r=2;//每次循环酒壶里的酒初始化 			for(w=0;w<15;w++) 			{ 				t=s[w]; 				{if(t==2) 					r=2*r;        //利用循环判断，如果s[]为2，则表示遇到店，否则，则是为1，遇到花；遇到店加倍，遇到花喝一斗 				else 					r--; 			} 				 				 		} 			 		if(r==0)//如果酒壶里的酒一滴不剩，则把这种情况输出 		{ 			z++; 			for(t=0;t<15;t++) 				printf("%d  ",s[t]); 			printf("\n"); 		} 		} 	} 	printf("\nz=%d\n",z);//最后输出总的种数 }

user: user-2
content: 这题目明显用递归容易解决些。。。

user: user-3
content: 引用 1 楼 user-4 的回复:这就是个最简单的动态规划吧。假定先遇到店，然后递归计算剩下的可能；再假定先遇到花，然后递归计算剩下的可能。遇到满足要求的组合就加1. #include<iostream> using namespace std; int sum=0; int f(int a,int b,int c){  // a:店的总数 b:花的总数减1 c:酒的初值 // 任何初始状况，都有两个可能：先遇到店，或者先遇到花    if(a>0)      f(a-1,b,c*2); // 逢店加一倍    if(b>0)      f(a,b-1,c-1); // 遇花喝一斗    if(a==0&&b==0&&c==1) //这个是满足要求的终止条件。没有店剩下，还剩一朵花和一斗酒      sum=sum+1;     return sum; } int main() {     f(5,9,2);     cout<<sum<<endl; }赞一个！传参的时候花只传9，说明还有一斗酒是留给最后一朵花的。哎，递归好神奇……

user: user-4
content: 这就是个最简单的动态规划吧。假定先遇到店，然后递归计算剩下的可能；再假定先遇到花，然后递归计算剩下的可能。遇到满足要求的组合就加1. #include<iostream> using namespace std; int sum=0; int f(int a,int b,int c){  // a:店的总数 b:花的总数减1 c:酒的初值 // 任何初始状况，都有两个可能：先遇到店，或者先遇到花    if(a>0)      f(a-1,b,c*2); // 逢店加一倍    if(b>0)      f(a,b-1,c-1); // 遇花喝一斗    if(a==0&&b==0&&c==1) //这个是满足要求的终止条件。没有店剩下，还剩一朵花和一斗酒      sum=sum+1;     return sum; } int main() {     f(5,9,2);     cout<<sum<<endl; }
user-0 提问: 在fedora上系统调用内存分配的问题

回复:
user: user-1
content: 淡定。。。 。

user: user-2
content: 最麻烦的是，A模块越界访问，修改了B模块分配的内存，这时候B模块会出现一些莫名其妙的现象，QA会找到B模块的程序员，于是就悲剧了……

user: user-2
content: 内存越界访问错误，未必会马上导致问题，特别是这种小程序。如果是大系统，有很多人都在用堆内存，那就不好说了。
user-0 提问: 关于函数指针数组

回复:
user: user-1
content: 看书或百度。。。

user: user-2
content: 指针数组 与二级指针在同类型下的内存分配 相同字节 可用相同的读取方法 与写入方法

user: user-3
content: 指針和數組其實很像，但是有些地方是不一樣的 你可以上http://imil.au.edu.tw/~hsichcl/TurboC/C_Unit10.htm看看
user-0 提问: 新手求助啊，求两数之间的较小数

回复:
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: #include <iostream>？？？怎么都用这个？

user: user-3
content: #include<iostream> int main() { using namespace std; int a,b; cin>>a>>b; cout<<(a>b)?b:a<<endl; exit(0); }

user: user-4
content: 要不你也可以这样，a>b?b:a;

user: user-5
content: 楼上都回答的很好了（。。分。。）

user: user-6
content: C做的  啊哈 #include<stdio.h> int mian(void) { int a,b;  printf("输入要比较的俩个数\n"); scanf_s("%d%d",&a,&b); printf("%d比较小\n",a>b?b:a); system("pause"); return 0; }

user: user-7
content: 仅供参考 #include <iostream> using namespace std; int main() {     int a,b,c;     cin>>a>>b;     c=a;     if(a>b)c=b;     cout<<c<<endl;     return 0; }

user: user-8
content: 楼主要认真看书哦

user: user-4
content: 我是来蹭分的。 #include <iostream> using namespace std; int main() { 	int a,b,c; 	cin>>a>>b; 	//其实加个{}会好看很多的，相信我，不要偷懒 	if(a>b) 	{  		c=b; 	}else //if    else if ? if 什么？你是想说 要不然就把a赋值给c这样的吧 如果这样，if就没必要了。 	{ 		c=a; 	} 	cout<<c<<endl; 	return 0;//你的;不是英文状态下的符号，可能是拼音？又或是五笔？ } //example 1： // 1 2 // 1 //请按任意键继续... //example 2: //4 6 //4 //请按任意键继续...

user: user-9
content: 楼主需要认真看书

user: user-10
content: 1、else c=a;去掉if 2、return 0;中文符号
user-0 提问: volatile修饰指针是在什么情况下出现及原因？

回复:
user: user-1
content: 楼主自己不是有例子了吗！

user: user-2
content: 补一下《计算机组成原理》中断相关知识点。

user: user-3
content: buffer指向一个地址被A线程使用，B线程修改了buffer所指的地址，同时希望A线程使用新地址，设置volatile。

user: user-4
content: 指针指向的内存也需要设置成volatile类型

user: user-5
content: 你能理解某个int为什么是volatile吗？如果可以的话，int*为什么是volatile也是同样的道理。至于例子，你不是已经说了嘛。

user: user-6
content: 不清楚，查了下http://blog.csdn.net/tigerjibo/article/details/7427366
user-0 提问: c语言分支-12. 计算火车运行时间(15)找不出错误。新手

回复:
user: user-0
content: 非常感谢哈。没想到取余，还有一个问题如果一个浮点型变量我想取他的整数舍去所有小数该怎么转换。

user: user-1
content: 你好算法不是很好理解，也有些问题，修改如下： #include <stdio.h> int main() {  	int t,a,b,d; int c; int m1=0; int m2=0; scanf("%d %d",&a,&b); c=(b-a)/100.0; m1=a%100; m2=b%100; //t=b-(int)(c)*100; //printf("%d\n",t); if(m2 >= m1) { d = m2 - m1; printf("%02d:%02d\n",c,d); } else{ d = m2 + 60 - m1; printf("%02d:%02d\n",c,d); }     return 0; }
user-0 提问: linux C下载软件的问题

回复:
user: user-1
content: 使用wget命令试试看

user: user-0
content: 经过调试发现，网络上有数据传递到本地，但是无法将数据写入硬盘。但是我下载其他网站的东西没问题呀。

user: user-2
content: 楼下正解。。。
user-0 提问: c语言中有关字符型指针输出字符串的一个问题

回复:
user: user-1
content: 没有内存，指针什么也不是，你要保存字符串，首先你要申请内存啊

user: user-2
content: 一楼说得对。  第一个代码，楼主可能正好碰巧没出错。多运行几次，或者scanf那里多输入点肯定会内存错误。

user: user-3
content: lz你这两个程序都有问题，并且都是一种错误 原因就是没有分配内存  所以指针a指向了一个不确定的位置，向该位置进行写操作可能会导致崩溃 可以这么改   #include<stdio.h> #include<stdlib.h> int main() {     char *a,*b;     printf("%d\n",&b);      a=(char*)malloc(6*sizeof(char));//分配内存     scanf("%s",a);     puts(a);  	free(a);//释放     return 0; }
user-0 提问: 为什么printf函数中以%d形式输出8.0/5.0  值为负数

回复:
user: user-1
content: 《计算机组成原理》

user: user-2
content: 因为浮点数与整数的编码方式是不同的

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

user: user-4
content: 这个应该很清楚了

user: user-4
content: #include <iostream> using namespace std; void print(double x) { 	int y = *(int*)&x; //printf中就是一个强制类型转换 	std::cout << y << std::endl;  } int main() { 	print(8.0/5.0); 	return 0; }

user: user-5
content: #include <stdio.h> void main() { 	printf("%f\n", 8.0 / 5.0);  //%f 浮点数 	printf("%d", (int)(8.0 / 5.0));  //%d 十进制有符号整数 }

user: user-6
content: 你百度下：浮点数 二进制表示 看完就懂了。
user-0 提问: 关于char **p和char *p[]问题的疑惑

回复:
user: user-1
content: 都是二级指针

user: user-2
content: 数组用作函数参数的时候，退化为指针。 int *p 和 int p[] 也是含义不同，但是，如果作为函数的参数，f(int p[])就等价于f(int *p)，在函数f里面p就是个指针。
user-0 提问: 求密码学基础术语解释？

回复:
user: user-1
content: 关于加密的算法直接百度google就行，不必深入了解

user: user-0
content: 引用 1 楼 zxhuser-1 的回复:百度。。。。 百度，谷歌都试过了。都是按“关键字”搜索，没搜到，才来发帖问的。真的是第一次接触密码学这些东西，如果知道一些，谢谢分享下嘛。

user: user-1
content: 百度。。。。
user-0 提问: 宏定义min(x, y)中(void)(&x==&y)含义？

回复:
user: user-0
content: 引用 3 楼 user-1 的回复:[quote=引用 2 楼 bx__8840668 的回复:] [quote=引用 1 楼 user-1 的回复:] 这个应该可以说明问题了 看完您给的链接，我的理解是在编译选项加上-Wunused-value时&_min1 == &_min2会给出warning，加上void来避免这个warning，请问是这个意思吗？[/quote] 是的。  更重要的是比较两个地址后扔掉比较结果的意义。 [/quote] 明白了，谢谢您了~

user: user-1
content: 引用 2 楼 bx__8840668 的回复:[quote=引用 1 楼 user-1 的回复:] 这个应该可以说明问题了 看完您给的链接，我的理解是在编译选项加上-Wunused-value时&_min1 == &_min2会给出warning，加上void来避免这个warning，请问是这个意思吗？[/quote] 是的。  更重要的是比较两个地址后扔掉比较结果的意义。

user: user-0
content: 引用 1 楼 user-1 的回复:这个应该可以说明问题了 看完您给的链接，我的理解是在编译选项加上-Wunused-value时&_min1 == &_min2会给出warning，加上void来避免这个warning，请问是这个意思吗？

user: user-1
content: 这个应该可以说明问题了
user-0 提问: 求助，关于c指针的字面量

回复:
user: user-1
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-2
content: 引用 1 楼 cs290473786 的回复:char* p = "Hello world!"，字符串常量所谓的字面值是指该字符串在常量区，不能够修改。 char ch[] = “Hello world!”，这里的字符串在栈区，可以通过指针修改。

user: user-3
content: 2楼的回复正解

user: user-4
content: 似都有道理

user: user-5
content: 推荐你看一本书《深入理解计算机系统》，在里面会讲到内存的分布图，现在基本上是使用ELF文件形式构建内存的，在这个文件里面，其中有一块是放data区。 首先字符串"Hello word"是常量，它会被放在data里面，并且不可改变。第二，字符指针p只是指向这个字符串"Hello word"的首地址。你现在用指针指向的地址去修改常量，那是不可以的，相当于这么修改： 2 = 4 这样肯定是不可以的，因为常量不可在赋值语句中作为左值。

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

user: user-6
content: 该说的都说了，那我就来拿积分吧

user: user-7
content: 你说的字面量是什么意思？  char *p="Hello word";这一句其实在编译器看来等价于 const char *p="Hello word"; const是常量，是不能改变的，所以你的代码会报错

user: user-8
content: char* p = "Hello world!"，字符串常量所谓的字面值是指该字符串在常量区，不能够修改。 char ch[] = “Hello world!”，这里的字符串在栈区，可以通过指针修改。
user-0 提问: 求一个易懂的思路

回复:
user: user-1
content: 不知道排在前面的那几个代码长什么样，有两个执行时占内存为0，代码又短 我写了一个hello world测试了下内存用了196K，代码178 B

user: user-1
content: 其实这种题目说明应该详细一些，再贴了我自己的测试用例，注意纯负数与正解在中间的情况： 4 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5 3 -5 -3 -1 8 -6 3 2 -7 1 3 2 -5 输出： Case 1: 14 1 4  Case 2: 7 1 6  Case 3: -1 3 3  Case 4: 6 5 7

user: user-1
content: 贴上我通过的代码，楼主的代码很接近了，有两个问题注意下： 1.你的begin =i;应改为begin =i+1; 2.输出格式很坑，应注意第二个Case前有换行，最后一个Case不要再换行 Case 1: 14 1 4  Case 2: 7 1 6  Case 3: -1 3 3  #include<stdio.h>  typedef struct {     int maxSum;     int startIndex;     int endIndex; }MAX_SUM_T;  int main(void) {     int i = 0;     int j = 0;     int l = 0;     int tmpSum = 0;     int lineNum = 0;     int inputNum = 0;     int addNum = 0;     MAX_SUM_T t_results[20] = {0};     int startIndex = 1;     int mark =0;      if (1!=scanf("%d",&lineNum))         return 1;      for (l=0;l<lineNum;l++)     {         if (1!=scanf("%d",&inputNum))             return 1;         tmpSum = 0;          startIndex = 1;                  for (i=0;i<inputNum;i++)         {             if (1!=scanf("%d",&addNum))                 return 1;              tmpSum+=addNum;              if (tmpSum<0)             {                 mark = 1;             }                          if (tmpSum>t_results[l].maxSum||0==i)             {                 t_results[l].maxSum = tmpSum;                 t_results[l].startIndex = startIndex;                 t_results[l].endIndex = i+1;             }              if (mark)             {                 mark=0;                 tmpSum = 0;                 startIndex = i+2;             }         }      }      for (i=0;i<lineNum;i++)     {         if (i>0)             printf("\n");         printf("Case %d:\n",i+1);         printf("%d %d %d\n",t_results[i].maxSum,t_results[i].startIndex,t_results[i].endIndex);     }      return 0; }

user: user-2
content: 引用 3 楼 u010622287 的回复:虽然...我看不懂这个，不过真的很想问一下   这个网站是多少啊？ 搜索杭电ACM

user: user-0
content: 引用 3 楼 u010622287 的回复:虽然...我看不懂这个，不过真的很想问一下   这个网站是多少啊？acm.hdu.edu.cn

user: user-3
content: 虽然...我看不懂这个，不过真的很想问一下   这个网站是多少啊？

user: user-4
content: 对于这种问题我只能围观了。。。

user: user-5
content: 楼主这是杭电上一个经典的DP问题，这个问题是一定要搞懂的，直接百度最大字序列吧，上面有详细的解释。
user-0 提问: 相同时间复杂度的算法，其时间复杂度之差

回复:
user: user-1
content: 这是要算 E 的节奏吗

user: user-2
content: 引用 2 楼 dianyancao 的回复:使用大O符号，那么O(n^2)=c*n^2，c是不依赖于n的常数 那么可设这两算法的时间复杂度分别为a*n^2和b*n^2 其差的绝对值为|a-b|n^2，其阶数视|a-b|的值而定 时间复杂度之差一般是用倍数关系来比较的，比如算法A和算法B的时间复杂度相差100倍这样的说法。  之差应该是上述的a/b的倍值。而不应该再是O（***）这类的写法了。

user: user-3
content: 使用大O符号，那么O(n^2)=c*n^2，c是不依赖于n的常数 那么可设这两算法的时间复杂度分别为a*n^2和b*n^2 其差的绝对值为|a-b|n^2，其阶数视|a-b|的值而定

user: user-4
content: 三个都有可能。具体没法算，因为都有可能。

user: user-3
content: 引用 3 楼 lovesmiles 的回复:之差应该是上述的a/b的倍值。而不应该再是O（***）这类的写法了。 嗯，应该使用复杂度的比值  O(n^2)是等于c*n^2加上比O(n^2)低阶的复杂度
user-0 提问: 大神们，帮小弟调试一下这个链表，我快疯了，是遍历那的问题HELP！（新人）

回复:
user: user-0
content: 我明白了谢谢

user: user-0
content: 大哥，我的问题出在哪？我没看懂

user: user-1
content: 仅供参考# include <stdio.h> # include <malloc.h>  struct list { 	int sore;//序号 	int data;//数据 	list * pvod;//下一个变量指针  };  list* create(void) { 	list* head=NULL; 	list* late=NULL; 	head=(list*)malloc(sizeof(list)); 	late=head; 	if(head==NULL) 	{ 		printf("内存节点申请失败！"); 		return NULL; 	} 	list* Element; 	int sor,dat; 	printf("请输入初始长度："); 	int i; 	scanf("%d",&i); 	for(int j=0;j<i;j++) 	{ 		printf("请输入序号和成绩："); 		scanf("%d %d",&sor,&dat); 		Element=(list*)malloc(sizeof(list)); 		if(Element==NULL) 		{ 			printf("内存节点申请失败！"); 			return NULL; 		} 		Element->data =dat; 		Element->sore =sor; 		head->pvod =Element; 		head=Element; 	} 	Element->pvod = NULL;	//防止后面的指针乱指，赋值为NULL，确保最后为NULL  //	Element=late; //	late=head; //	head=Element->pvod; 	return late; } void  traverse(list*head) { 	printf("-------------\n"); 	head = head->pvod;//表头没赋值，跳过  	while(head != NULL) 	{ 		printf("成绩是：%d序号是%d\n",head->data,head->sore); 		head=head->pvod; 	} 	 	printf("------------\n"); }  int main(void) { 	list* head=create(); 	traverse(head); 	return 0; }
user-0 提问: 求解释设计到 指针数组， 指针常量，指针的指针的这个程序

回复:
user: user-1
content: 引用 7 楼 czjacke 的回复:也就是可以这么理解吗： 把argv理解为指向argv[]指针数组中的argv[0],而把argv当做是一个指向指针的指针变量！！  以前浅显地学过c语言，现在导师项目要求编程，现在来重新学习C，指针都快被弄晕了！！！ 对，是这样的。 《C和指针》，找来看看吧。

user: user-2
content: 函数参数里的数组，其实是指针

user: user-0
content: 引用 8 楼 brookmill 的回复:[quote=引用 7 楼 czjacke 的回复:] 也就是可以这么理解吗： 把argv理解为指向argv[]指针数组中的argv[0],而把argv当做是一个指向指针的指针变量！！  以前浅显地学过c语言，现在导师项目要求编程，现在来重新学习C，指针都快被弄晕了！！！ 对，是这样的。 《C和指针》，找来看看吧。[/quote]谢谢！！！！！

user: user-0
content: 引用 5 楼 brookmill 的回复:楼主可以搜一下“参数 数组 退化 指针” 对于局部变量或者全局变量的数组名，确实不允许修改。但是，数组名作为参数的时候，编译器是把它按照指针来处理的，所以，函数里面他就是个指针。这和什么类型的数组没关系。 比如 int f(int a[])  // 这个完全等价于 int f(int *a) { a++; // 这个是允许的。 } 楼主的例子，char * argv[]就等于char **argv，也确实有人这么写。也就是可以这么理解吗： 把argv理解为指向argv[]指针数组中的argv[0],而把argv当做是一个指向指针的指针变量！！   以前浅显地学过c语言，现在导师项目要求编程，现在来重新学习C，指针都快被弄晕了！！！

user: user-3
content: 引用 5 楼 brookmill 的回复:楼主可以搜一下“参数 数组 退化 指针” 对于局部变量或者全局变量的数组名，确实不允许修改。但是，数组名作为参数的时候，编译器是把它按照指针来处理的，所以，函数里面他就是个指针。这和什么类型的数组没关系。 比如 int f(int a[])  // 这个完全等价于 int f(int *a) { a++; // 这个是允许的。 } 楼主的例子，char * argv[]就等于char **argv，也确实有人这么写。  楼上说的对，呵呵

user: user-1
content: 楼主可以搜一下“参数 数组 退化 指针” 对于局部变量或者全局变量的数组名，确实不允许修改。但是，数组名作为参数的时候，编译器是把它按照指针来处理的，所以，函数里面他就是个指针。这和什么类型的数组没关系。 比如 int f(int a[])  // 这个完全等价于 int f(int *a) { a++; // 这个是允许的。 } 楼主的例子，char * argv[]就等于char **argv，也确实有人这么写。

user: user-4
content: 其实这是一个 “步长”  问题 ++argv;就是将argv往下移动一个“步长” 地址，在这里是往下移动一列值； 列值： argv[0][0].......[n]              argv[1][0]......[n]  ++argv,指针从argv[0]移到argv[1]

user: user-5
content: 既然是指针地址，肯定就可以进行++操作的，但是这个++不一定是+1； 例如：int *argv[]中argv++地址会后移四个字节，这个和申明的类型有关系。

user: user-6
content: 你说的没错，argv是字符串数组的第一个地址，按理说也是指针常量。 但是，这个数组是char * 的，比较特殊，argv可以作为左值。

user: user-7
content: char* argv[]是指针数组。argv[0]存储的是指针。++argv，就是下一个指针argv[1]
user-0 提问: 菜鸟求教，忘各位大神指教。。。

回复:
user: user-1
content: a=b=c; 这种连等号a和b都必须是左值，等价与 b=c; a=b; 你的代码里中间那个表达式显然不是。把它展开 (unsigned int)(lati-p1.y)*(p2.x-p1.x)/(unsigned int)(p2.y-p1.y) =p1.x;  //显然错误 unsigned int jx = (unsigned int)(lati-p1.y)*(p2.x-p1.x)/(unsigned int)(p2.y-p1.y);

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

user: user-3
content: 楼主写这个表达式想完成什么功能？。。
user-0 提问: 新手入門,找不出的bug

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

user: user-2
content: for (i=0;i<65;i++) { bit[i]=0; } 越界了
user-0 提问: 下面这个多项式相加相乘的程序问题出在哪里了？

回复:
user: user-1
content: 第46行    scanf("%d", &high_power); 改成 ： scanf("%d", &pol->HighPower); 理由。。一眼就能看出来了吧== 还有你没考虑常数项是X的0次方。直接从X的1次方考虑的。
user-0 提问: 关于《C,C++表达式求值顺序 裘老的解释。》的疑问

回复:
user: user-0
content: 解惑了，参考：http://bbs.csdn.net/topics/380213111 operator<<(operator<<(operator<<(cout, a), a++), endl) 具体说来是红色的那一层operator<<的两个参数operator<<(cout, a)和a++的求值顺序由编译器自行决定。如果先求出前者输出就是44，如果先求出后者输出就是54。而45在正常情况下是不可能的。 后一个指针的例子，则还有编译器的乱序优化小聪明。 至于究竟什么才是“定义了的行为”，请自行网上搜索C++顺序点。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:我的回帖中已经解释的很清楚了。 将置顶中的所有贴子看了一遍，赵老师的回复主要讲两点： 1.根据自己的编译器看汇编，找结果，不迷信书本、文字等 2.提了下各运算符优先级  我的问题在于，根据某一汇编，cout<<a++<<a<<endl;它的顺序是明确的，但是如果同一段代码用不同的编译器 编译得到的汇编执行结果不同，这是不能容忍的，我想知道的这些汇编生成的规则，如果只知其然，不知其所以 然，掉坑是必然的。  抛开裘老的解释，我的问题在于，对于cout<<a++<<a;这种语句，编译器要遵循什么规则来编译，哪个顺序是未 定义的？  根据目前的结果，要么它输出4，4，要么它输出4，5  输出4，4，则该命令相当于： cout<<a cout<<a a++; 输出4，5，该命令相当于： cout<<a a++; cout<<a 如果只迷信这样的结果，很容易做出，第一步肯定是cout<<a是没问题的，问题在于a++对于后一个输出是否起作用，这样的论 断有问题，接下来的例子是这样的： a=4; cout<<a<<a++; 1个可能的输出的结果是5,4 那么这又相当于是 tmp = a; a++; cout<<a; cout<<tmp;  对于上面这两个例子，编译系统是根据什么原则来编译的，表示不理解

user: user-1
content: 我的回帖中已经解释的很清楚了。

user: user-0
content: 没人吗，顶顶
user-0 提问: 醉了，为什么我调用的函数不执行呢？

回复:
user: user-1
content: 没走是什么意思？程序能正常执行的啊。 不过你这样写的意义何在？传了两个参数，一个都没用到，有一个返回值，返回值也没用到

user: user-0
content: 引用 1 楼 yangyangsnr 的回复:没走是什么意思？程序能正常执行的啊。 不过你这样写的意义何在？传了两个参数，一个都没用到，有一个返回值，返回值也没用到我VC犯2了，我调函数没反映，这个用来测试，我后面重启了VC就好了，哎。
user-0 提问: 求助：刚学C语言，题目：从键盘输入一个小于1000的正数，要求输出它的平方根，如果平方根不是整数，则输出其整数，运行结果是负数

回复:
user: user-1
content: 从键盘任意输入一个键。如果是正数求平方根，如果是负数，求相反数后求平方根,。。。。       刚学，求解

user: user-0
content: 删除了else之后可以了，谢谢！

user: user-2
content: 前面输入大于1000，直接执行if语句 else跳过去了，没有执行，所以看起来怪数字，实际是因为b没有初始化。 你要把开放放在else的外面。不要放在else里面。
user-0 提问: u32等类型是在哪个头文件中定义？

回复:
user: user-1
content: 补充下，  struct fw_data {     short offset：8; };  占两个字节  struct fw_data {     short offset：8;     int:0; }; 变成占4个字节 struct fw_data {     short offset;     int:0; };  还是两个字节 综上，int:0的作用是在当前一个结构体成员只使用几位的时候，int:0会将这个成员所占空间填为int所占的4个字节，然后 下一个成员在4个字节后开始计算

user: user-1
content: struct fw_data {     u32 offset : 8;     u32 : 0;     u32 val; };  占8个字节  struct fw_data {     int offset : 8;     int c:8;     int : 0;     int val; };  还是占8个字节  struct fw_data {     int offset : 8;     int : 0;     int c:8;     int val; };  占了12个字节 综上, int:0将前一个int的剩余位数占用 U32的话还可以在当前文件自己再定义一个U32,编译冲突时会告诉原来你在哪定义的

user: user-2
content: 从下一个字节或int开始新的位域？

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

user: user-0
content: 自顶一个~~
user-0 提问: 刚接触C语言，这是我的问题以及总结，求教

回复:
user: user-1
content: http://bbs.csdn.net/topics/390676437

user: user-2
content: 所以会产生数据不精确问题

user: user-2
content: 计算机中浮点数是以 （-1）s * m * 2^f表示的   m表示小数位 f小数位数

user: user-3
content: 关于格式化输出， 好好记住这个  对于printf， %f可以输出double,  float会自动转为double， 不需要%lf. 但是要输出long double就要用%Lf。   还有， 浮点数规格化（10进制转2进制）是有误差的。

user: user-4
content: IEEE745

user: user-5
content: 楼主可以去了解一下float和double的精度，以及计算机中浮点数的存储问题 建议最好下载一个帮助文档看看，如——

user: user-0
content: 刚学C，有点不懂，谢谢大家回答
user-0 提问: 今天早上起床发现有人说用C语言做了.apk真的可以么？

回复:
user: user-1
content: 可以完全不用Java写。甚至可以不用NDK（直接使用NDK打包的standalone toolchain和Android SDK）。 不过生成的.apk里还是有Java代码的默认实现。

user: user-2
content: 看看有没有.so后缀的文件名就知道了。

user: user-2
content: 应该说的是jni吧。 底层主要逻辑是用c写的。  接口还是要java转一下。

user: user-3
content: LZ可以把解包后的文件名列出来啊。你自己看得不一定准。 Java可以JNI调用的LZ还知道？
user-0 提问: linux C/C++ proc 连接oracle 求教

回复:
user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令 #0  0x007256c6 in __strlen_sse2_bsf () from /lib/i686/nosegneg/libc.so.6 #1  0x08048c97 in tolower (s=0x4e <Address 0x4e out of bounds>) at mtest.pc:117 #2  0x41994696 in nlpatolower () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #3  0x41995954 in nlpagtcase () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #4  0x4199581a in nlpaputval () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #5  0x4199568a in nlpainzert () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #6  0x4042f007 in nlpaparse () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #7  0x4042ed43 in nlpardfile () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #8  0x4042e856 in nlpains () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #9  0x4042e695 in nlpainso () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #10 0x402e1dca in nlstdlp_load_psource () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #11 0x4197e875 in nlstdggo () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #12 0x4197e67b in nlstdgg () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #13 0x40398562 in nigini2 () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #14 0x40754f9c in kpeDbgGetNPDGlobal () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #15 0x40754ec8 in kpeDbgTLSInit () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #16 0x41a5898f in kpummTLSGET1 () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #17 0x4075503a in kpeDbgProcessInit () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #18 0x40753590 in kpummpin () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #19 0x40293f88 in kpupin () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #20 0x40262f28 in OCIInitialize () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #21 0x4023b1c5 in sqgctx () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #22 0x41954344 in sqgrct () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #23 0x419527b1 in sqlcmex () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #24 0x419525cc in sqlcxt () from /home/oracle/product/11.2/lib/libclntsh.so.11.1 #25 0x08048b9c in db_connect () at mtest.pc:109 #26 0x0804903a in main () at mtest.pc:222  我不debug 怎么知道在哪里core的勒。上面说的109行 我已经修改！~ 反正就是EXEC SQL  connect :sql_userid IDENTIFIED BY :sql_passwd using :sql_dbname; core

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

user: user-2
content: 我也是刚接触proc链接oracle，主要参考这个网页里的资料，楼主看一下有没有帮助 http://bbs.chinaunix.net/thread-9155-1-1.html