user-0 提问: 同样的代码为什么C和C++得出不同的结果呢。问题较复杂，我举例进行了说明。

回复:
user: user-0
content: 再自己顶一顶

user: user-0
content: 我用GDB工具进行了调试：  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.  Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". For bug reporting instructions, please see: <http://bugs.launchpad.net/gdb-linaro/>. (gdb) file c Reading symbols from /home/pcd/workspace/myjava/jni/c...done. (gdb) b 9 Breakpoint 1 at 0x4008af: file c.c, line 9. (gdb) r Starting program: /home/workspace/myjava/jni/c  warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000  Breakpoint 1, main (argc=1, argv=0x7fffffffe1a8) at c.c:13 13	int main(int argc, char* argv[]){ (gdb) s 15		int nRetCode = 0; (gdb) s 16		int imghandle = 0; (gdb) s 18	        void *imglib = dlopen("./libLGM.so", RTLD_LAZY); (gdb) p imglib $1 = (void *) 0x0 (gdb) s [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Cannot find new threads: generic error (gdb)

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。  有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行！ 写日志到文件参考下面： #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: user-0
content: 努力了这么久，就差这最后一步。居然停滞不前了。郁闷。

user: user-2
content: 估计还是哪里写的有错误，要不不应该。

user: user-0
content: 我也感觉这个问题挺为难大家，能提示就行。

user: user-0
content: P1和P2打印的结果如下，因为太多所以部分截取， C++调用后的结果和C/JAVA调用后的结果一样啊。我通过对比工具比较了。   P1：11820010001331961701930188143656352160651421561856534241159654221107621021371806424531196631251867065229211166169623519113164766310003000000000000000000000000000 --------------------------------- P2：118200100023463186193179710765139183107652371591956522622014265112413764229202256422014610164222181652351461371935367576319014820463192219110641951941861911342241866323613516719223612198192672512226410530118641711310063221611561901501241106425321466193199109138641701221619025451506410003000000000000000000000000000   引用 9 楼 lgmsyy 的回复:[quote=引用 8 楼 mujiok2003 的回复:] [quote=引用 6 楼 lgmsyy 的回复:] [quote=引用 1 楼 mujiok2003 的回复:]  //printf("%d",p1[i]); printf("%hhu",p1[i]); .... printf("%hhu",p2[i]);   z这事做什么[/quote]  %hhu--->unsigned char[/quote]  打印的结果是一样的[/quote]

user: user-0
content: 引用 11 楼 max_min_ 的回复:这样看的话，有没有可能是第三方库的问题的呢？\ 如果是第三方库的问题，为什么我直接用C++调用是可行的。 而用C调用和JAVA调用都不成。

user: user-3
content: 这样看的话，有没有可能是第三方库的问题的呢？

user: user-0
content: 请大家帮忙啊。

user: user-0
content: 一定要弄好它

user: user-0
content: 引用 20 楼 zhao4zhong1 的回复:调试不了对应C/C++代码，但可以调试对应汇编指令。 --------------------------- layout regs：显示源代码/反汇编和CPU寄存器窗口 layout asm：显示反汇编窗口 这些我都用上了，可是 ---------------------------- void *imglib = dlopen("./libLGM.so", RTLD_LAZY);//第三方提供的动态链接库 一到调用第三方库的时候就提示以下：  Breakpoint 1 at 0x4008af: file c.c, line 9. (gdb) r Starting program: /home/pcd/workspace/myjava/jni/c   Breakpoint 1, main (argc=1, argv=0x7fffffffe1a8) at c.c:13 (gdb) s [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Cannot find new threads: generic error (gdb)

user: user-1
content: 调试不了对应C/C++代码，但可以调试对应汇编指令。

user: user-0
content: int nSample = _ThridTestone(p, p1);  float result  = _ThridTesttwo(p1, p2);  这两个函数都是第三方动态链接库提供的对外函数，我通过GDB怎么才能进入函数体中进行调试。 当然，对方只提供个SO动态链接库而已。

user: user-0
content: 引用 8 楼 mujiok2003 的回复:[quote=引用 6 楼 lgmsyy 的回复:] [quote=引用 1 楼 mujiok2003 的回复:]  //printf("%d",p1[i]); printf("%hhu",p1[i]); .... printf("%hhu",p2[i]);   z这事做什么[/quote]  %hhu--->unsigned char[/quote]  打印的结果是一样的

user: user-4
content: 引用 6 楼 lgmsyy 的回复:[quote=引用 1 楼 mujiok2003 的回复:]  //printf("%d",p1[i]); printf("%hhu",p1[i]); .... printf("%hhu",p2[i]);   z这事做什么[/quote]  %hhu--->unsigned char

user: user-0
content: 引用 5 楼 ningxialieri 的回复:C在编译时，直接保存了函数名。但是c++编译时的函数名包括signature信息，目的是为了重载  我用的而是重载，为了大家方便看所以 _ThridTestone(p, p1);	 实际上_Z35ThridTestoneXXXX类似这样的名字，冲裁函数我保证用的没错。

user: user-0
content: 引用 1 楼 mujiok2003 的回复: //printf("%d",p1[i]); printf("%hhu",p1[i]); .... printf("%hhu",p2[i]);   z这事做什么

user: user-5
content: C在编译时，直接保存了函数名。但是c++编译时的函数名包括signature信息，目的是为了重载

user: user-6
content: 外部函数声明时前面加上 extern "C"