Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 新手C语言求教

回复:
user: user-1
content: 看到LZ的要求，觉得要用到设置光标的函数及sleep休眠函数，以下是我的代码（在VC6运行），LZ看看符不符合要求： #include <stdio.h> #include <conio.h> #include <windows.h>  void setPosition(int x, int y) { 	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台的句柄 	COORD newPosition = {x, y};//COORD是个结构体，包含列，行的坐标 	SetConsoleCursorPosition(hConsole, newPosition); 	return ; }  int main(int argc, char **argv) { 	int i;  	for (i=1; i<=3; i++) 	{ 		printf("%2d", i); 		Sleep(1000); 	}  	setPosition(0, 0); 	for (i=1; i<=3; i++) 	{ 		printf("%2d", ((i+1) == 4) ? 1 : i+1); 		Sleep(1000); 	} 	return 0; }

user: user-2
content: 引用 10 楼 u012632434 的回复:[quote=引用 9 楼 hanlingxia 的回复:] #include <stdio.h> #include <windows.h>  void main() { 	printf("%d ", 1);  	Sleep(1000); 	printf("%d ", 2); 	Sleep(1000); 	printf("%d ", 3);  	system("cls"); 	Sleep(1000); 	printf("1"); 	Sleep(1000); 	system("cls"); 	Sleep(1000); 	printf("2"); 	Sleep(1000); 	system("cls"); 	Sleep(1000); 	printf("3"); } 是这样吗？ 3q,虽然最后没有输出2,3,1，只输出了3，我自己改改[/quote]不客气~~

user: user-2
content: #include <stdio.h> #include <windows.h>  void main() { 	printf("%d ", 1);  	Sleep(1000); 	printf("%d ", 2); 	Sleep(1000); 	printf("%d ", 3);  	system("cls"); 	Sleep(1000); 	printf("1"); 	Sleep(1000); 	system("cls"); 	Sleep(1000); 	printf("2"); 	Sleep(1000); 	system("cls"); 	Sleep(1000); 	printf("3"); } 是这样吗？

user: user-3
content: 加个sleep就可以了

user: user-4
content: 运行的时候休眠下应该可以啊 #include<stdio.h> #include <windows.h> void main() {  printf("1");  Sleep(1000);  printf("2"); }

user: user-4
content: 引用 5 楼 junlinfushi 的回复:这需要用的时间函数 Sleep(1000*15)？这个应该可以吧

user: user-5
content: 这需要用的时间函数

user: user-0
content: 引用 9 楼 hanlingxia 的回复:#include <stdio.h> #include <windows.h>  void main() { 	printf("%d ", 1);  	Sleep(1000); 	printf("%d ", 2); 	Sleep(1000); 	printf("%d ", 3);  	system("cls"); 	Sleep(1000); 	printf("1"); 	Sleep(1000); 	system("cls"); 	Sleep(1000); 	printf("2"); 	Sleep(1000); 	system("cls"); 	Sleep(1000); 	printf("3"); } 是这样吗？ 3q,虽然最后没有输出2,3,1，只输出了3，我自己改改

user: user-0
content: 我表述有误，是运行程序后，先看到1,2,3依次出来，然后看到1变成2,2变成3，3变成1  引用 1 楼 junlinfushi 的回复:要编译器看到变化过程???????? 不是，我表述有误，是运行程序后，先看到1,2,3依次出来，然后看到1变成2,2变成3，3变成1

user: user-0
content: 引用 楼主 u012632434 的回复:输出1,2,3，并把1变成2,2变成3，3变成1，要编译器看到变化过程 我表述有误，是运行程序后，先看到1,2,3依次出来，然后看到1变成2,2变成3，3变成1

user: user-6
content: 不太明白题目是什么意思。 难道是: if (a==1) {   printf("修改前a==%d\n",a);    a = 2;    printf("修改后a==%d\n",a); } 这样？

user: user-5
content: 要编译器看到变化过程????????
user-0 提问: 帮我看下多文件关系问题

回复:
user: user-0
content: root@kali:~# make clean makefile:8: *** 遗漏分隔符 。 停止。  这makefile随它去，我想问下什么情况用#include，什么情况用extern。

user: user-1
content: 引用 3 楼 u012453424 的回复:[quote=引用 1 楼 user-1 的回复:]  CC =gcc #如果头文件和源文件都在同一级目录下,如果不是后面相对源文件的路径 CFLAGS = -I./ OBJS = main.o 64.o 54.o TARGET = 64   $(TARGET):$(OBJS)     $(CC) -o $(TARGET) $(OBJS) $(CFLAGS) $(OBJS):%.o:%.c     $(CC) -c $(CFLAGS) $< -o $@ clean:     rm 64 $(OBJS)  你的makefile第8行遗漏东西了[/quote] 其实的代码感觉有点累赘，包含下头文件就好了！没必要extern了 另外 第8行少了什么呢？

user: user-0
content: 引用 1 楼 user-1 的回复: CC =gcc #如果头文件和源文件都在同一级目录下,如果不是后面相对源文件的路径 CFLAGS = -I./ OBJS = main.o 64.o 54.o TARGET = 64   $(TARGET):$(OBJS)     $(CC) -o $(TARGET) $(OBJS) $(CFLAGS) $(OBJS):%.o:%.c     $(CC) -c $(CFLAGS) $< -o $@ clean:     rm 64 $(OBJS)  你的makefile第8行遗漏东西了

user: user-0
content: 除了makefile，别的地方没一点问题了吗？

user: user-1
content: CC =gcc #如果头文件和源文件都在同一级目录下,如果不是后面相对源文件的路径 CFLAGS = -I./ OBJS = main.o 64.o 54.o TARGET = 64   $(TARGET):$(OBJS)     $(CC) -o $(TARGET) $(OBJS) $(CFLAGS) $(OBJS):%.o:%.c     $(CC) -c $(CFLAGS) $< -o $@ clean:     rm 64 $(OBJS)
user-0 提问: 在while循环中能循环调用函数，怎么调用一次后不调用啦？

回复:
user: user-1
content: 你可以把你的函数体改成有条件执行的 在while循环之前定义static a = 0; type func(args) {   if (a == 0)   {       函数体   }   ++a; } 这样第一次调用后的调用执行的都是空操作

user: user-2
content: http://bbs.csdn.net/topics/390335073

user: user-3
content: 你的程序我虽然不知道你在干嘛，因为数学问题我不懂。 但是你的程序我能运行，输出结果也近似于无限输出。 不过我提个建议就是，变量声明的时候最好初始化。或者赋初始值。这样会少不少不明错误

user: user-4
content: 代码又长又乱 你把while标成红色啊 出问题的地方是红色的 在while循环中能循环调用函数，怎么调用一次后不调用啦？ 肯定是 条件为假  跳出了  ifZ( a, b, iAexplain ,fA, fC, fZ); int swap=1; while(swap ==1) { circulate( a, b, iAexplain , fB, fC, fZ, fA); output(fA,  iAexplain,fC, fB, a, b,fZ); if(mm(fZ,b)==1) swap=0; else swap=1; } 执行一次 if(mm(fZ,b)==1) swap=0; 直接就是swap是0了 推理mm(fZ,b) 这个函数永远返回1 继续推理  int mm(float fz[],int a) { int h=0; for(int i=0;i<a;i++) { if(fz[i]<=0) h++; } if(h==a) return 1; else  return 0; } 推理 if(h==a) return 1; h永远等于a 继续推理 int h=0; for(int i=0;i<a;i++) { if(fz[i]<=0) h++; } 继续推理 if(fz[i]<=0) 这个永远小于等于0 推理出  fz[] 传参到底是什么东西 检查  你写的代码太乱了 数学功底太深了 真是大神级人物啊 、 以上推理纯属主观臆断 没有debug 我也不敢说你问题出在哪 仅供参考

user: user-5
content: 太长了，不想看
user-0 提问: 求助各位大神，计算机如何判断我们访问的一个地址是非法地址呢？

回复:
user: user-1
content: 引用 14 楼 u011416173 的回复:[quote=引用 3 楼 user-12 的回复:] 汇编问题去汇编子版。 去了，没人回，着急了就回这发了，各位的回复我尽快看，刚看到。 谢谢各位了！[/quote] 还是会有非法的，无论你用什么语言，都是MMU来管理内存，不是实模式下的内存都需要经过那套复杂的映射过程。

user: user-0
content: 引用 3 楼 user-12 的回复:汇编问题去汇编子版。 去了，没人回，着急了就回这发了，各位的回复我尽快看，刚看到。 谢谢各位了！

user: user-2
content: 引用 楼主 u011416173 的回复:在汇编语言层次，还存在所谓的非法地址么？我的意思是cpu对任何地址都可以访问，读取或者修改。  汇编层次一样有非法地址啊，关键是看系统有没有介入，os有个功能叫内存管理，是os的核心功能之一，你对内存的访问都要通过一个在计算机上叫mmu的玩意儿，这是一个设备，os在启动系统的过程中接管了mmu，并且通过内存管理单元，os会对内存做一个全局的管理。 比如那段是程序a的，哪段是程序b的，哪段是内核的，自然你越界了，os就有各种反应 裸板没有os，但是你越界的话 一样会造成不可挽回的错误

user: user-3
content: exe编译好了, 里面也是汇编代码, 所以你直接使用汇编代码同样会访问非法. 这是操作系统规定好的, 只有在系统内核中限制才会少一些.  这可能涉及到权限和内存管理机制了.

user: user-4
content: 每个运行在操作系统上的程序，其内存都是操作系统分配的，以Win32为例，每个程序所拥有的是一个4G的地址空间，也就是你的地址是4个G，但并不代表你真的有这么多内存可访问，你要用内存就必须向操作系统申请，由它分配给你一块真实的内存，对应地址空间里的一段。如果你访问一个实际上它没有分配给你的地址，那就是非法地址。

user: user-5
content: 跟汇编没关系  关键是看你调用的api是什么，你在r0还是r3，你使用的os是什么，你使用的硬件要求  从上往下，一路过去，谁都可以说，你访问非法

user: user-6
content: win32 API:  IsBadCodePtr IsBadReadPtr IsBadStringPtr IsBadWritePtr

user: user-7
content: 参考Intel CPU手册，内存区段管理。

user: user-8
content: 引用 8 楼 nadleeh123 的回复:[quote=引用 楼主 u011416173 的回复:] 在汇编语言层次，还存在所谓的非法地址么？我的意思是cpu对任何地址都可以访问，读取或者修改。  汇编层次一样有非法地址啊，关键是看系统有没有介入，os有个功能叫内存管理，是os的核心功能之一，你对内存的访问都要通过一个在计算机上叫mmu的玩意儿，这是一个设备，os在启动系统的过程中接管了mmu，并且通过内存管理单元，os会对内存做一个全局的管理。 比如那段是程序a的，哪段是程序b的，哪段是内核的，自然你越界了，os就有各种反应 裸板没有os，但是你越界的话 一样会造成不可挽回的错误[/quote] +1

user: user-9
content: 引用 楼主 u011416173 的回复:在汇编语言层次，还存在所谓的非法地址么？我的意思是cpu对任何地址都可以访问，读取或者修改。  CPU可以访问任何地址，但你的程序不行。这里有个权限的问题。

user: user-10
content: 其实判断不了。但是如果你访问的太出格，比如操作系统都没有分配的内存，保留的地址，标记为不可访问的地址，等等，OS会拦截下来给Runtime报告你这个是非法地址。

user: user-11
content: 32位程序，可以用4G的内存。 如果系统给足够4G的内存的话，除了系统保护的地址外（一般前64k）都不会非法操作的。 但系统怎么会给够一个进程4G，虽说内存便宜，但几百G还是不少钱的。

user: user-12
content: 汇编问题去汇编子版。

user: user-0
content: 顶个，大神帮帮忙

user: user-0
content: 还望各位大神不吝赐教啊
user-0 提问: 结构体的成员变量是指针的地址问题

回复:
user: user-1
content: 指针变量本身的地址 指针变量中存储的数值（地址）

user: user-2
content: 那是因为它指向还没有，随机值！ 但是打印它指针本身递地址都是间隔4个字节是对的！  printf("s = %p \n", pTest);     printf("a = %p \n", &(pTest->a));     printf("b = %p \n", &(pTest->b));     printf("c = %p \n", &(pTest->c));  //结果 s = 0x8526008  a = 0x8526008  b = 0x852600c  c = 0x8526010

user: user-3
content: typedef struct {     int *a;     int *b;     int c; }test;  int main( void ) {     test *t = ( test * )malloc( sizeof( test ) );     printf( "%x\n", t );//t的地址     printf( "%x\n", t->a );//成员a的值，你又没赋值，谁知道什么内容，地址t+0     printf( "%x\n", t->b );//同上 地址 t+4     printf( "%x\n", &t->c ); //地址 t+8 }

user: user-4
content: 指针变量都要程序员自己给它申请地址空间的。lz这只对结构体指针t申请了地址空间，而结构体内的指针a和b没有申请地址空间。

user: user-5
content: typedef struct {     int *a;     int *b;     int c; }test;   int main( void ) {     test *t = ( test * )malloc( sizeof( test ) );     printf( "%x\n", t );             //因为t是结构体，所以t=&t，用t能打印t结构体的首地址。     printf( "%x\n", t->a );       //t->a是一个成员，该成员本身占用4个字节，这4个字节的内容为他指向的变量的地址。因为这里没显示赋初值（即该指针没指向任何变量），初值依赖于编译器的实现。     printf( "%x\n", t->b );       //同上     printf( "%x\n", &t->c );      //这里用了地址符，指的是t->c这个成员的地址，没问题。 }   正确代码应为：  typedef struct {     int *a;     int *b;     int c; }test;   int main( void ) {     test *t = ( test * )malloc( sizeof( test ) );     printf( "%x\n", &t );       //加上地址符使代码易读性更好     printf( "%x\n", &(t->a) );  //加上&才是t->a这个 类型为指针的结构体成员 的本身地址     printf( "%x\n", &(t->b) );  //同上     printf( "%x\n", &(t->c) );  //代码少依赖于优先级顺序更好     free(t);                    //要养成好习惯哦 }

user: user-6
content: 引用 3 楼 max_min_ 的回复:那是因为它指向还没有，随机值！ 但是打印它指针本身递地址都是间隔4个字节是对的！  printf("s = %p \n", pTest);     printf("a = %p \n", &(pTest->a));     printf("b = %p \n", &(pTest->b));     printf("c = %p \n", &(pTest->c));  //结果 s = 0x8526008  a = 0x8526008  b = 0x852600c  c = 0x8526010  正解
user-0 提问: 程序出现如下问题，求破。。。

回复:
user: user-1
content: debug，单步调试，现追到出错点，再查找出错原因

user: user-2
content: heap crash, 堆损毁

user: user-3
content: 点击 中止，然后在调试菜单中，查看一下调用堆栈。就能定位出错点了

user: user-4
content: 貌似数组越界，检查一下吧，检查不出来就debug

user: user-5
content: 引用 2 楼 wangdahu888 的回复:点击 中止，然后在调试菜单中，查看一下调用堆栈。就能定位出错点了  不是点击中止，是点击重试...然后查看堆栈...

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

user: user-0
content: 这是调试的情况：
user-0 提问: 新手小白求指教C语言编程

回复:
user: user-1
content: printf wrong  ...

user: user-2
content: \n是转移字符，也是字符串的一部分。

user: user-3
content: 引用 3 楼 max_min_ 的回复:注意：细心点，多调试代码！根据编译器提示的错误联系上下文找可能的语法错误！ printf("help,world!\n");+1

user: user-4
content: 我也是刚入门  那个\n要写在""里面的

user: user-5
content: 注意：细心点，多调试代码！根据编译器提示的错误联系上下文找可能的语法错误！ printf("help,world!\n");

user: user-6
content: 引用 1 楼 keiy 的回复:#的地方没错,可能是你编译器设置的问题,程序在printf处有错 #include<stdio.h>   int main()  {         printf("help,world!\n");         return 0;  }  注意 printf()中 “”的位置

user: user-7
content: #的地方没错,可能是你编译器设置的问题,程序在printf处有错 #include<stdio.h>   int main()  {         printf("help,world!\n");         return 0;  }
user-0 提问: 二叉树运行结果有误~求修改

回复:
user: user-1
content: cd[n-1]='\0';//从右向左逐位存放编码，首先存放编码结束符 上面这行要移到下一行后面:   cd=(char *)malloc(n*sizeof(char));//分配求当前编码的工作空间   cd[n-1]='\0';//从右向左逐位存放编码，首先存放编码结束符  以下2行:   int min1=INT_MIN;//最小值,INT_MAX在<limits.h>中定义   int min2=INT_MIN;//次小值 要改为:   int min1=INT_MAX;//最小值,INT_MAX在<limits.h>中定义   int min2=INT_MAX;//次小值
user-0 提问: 如何判断一个.o文件是否有gdb信息

回复:
user: user-1
content: 用如下命令：  objdump -t a.o   如果出现如下的.debug_段，则表示里面有调试信息，可以用gdb进行调试：  00000000 l    d  .debug_aranges	00000000              .debug_aranges 00000000 l    d  .debug_pubnames	00000000              .debug_pubnames 00000000 l    d  .debug_info	00000000              .debug_info 00000000 l    d  .debug_abbrev	00000000              .debug_abbrev 00000000 l    d  .debug_line	00000000              .debug_line 00000000 l    d  .debug_frame	00000000              .debug_frame 00000000 l    d  .debug_str	00000000              .debug_str 00000000 l    d  .debug_loc	00000000              .debug_loc  引用 楼主 nbda1121440 的回复:假设有一个文件a.c  我可以这么编译：gcc -o a.o -c a.c 也可以这么编译：gcc -o a.o -c a.c -g  请问我如何根据已有的a.o判断到底是上面两种中哪一种方式编译的？

user: user-2
content: objdump -参数 man objdump 我记不住了 汇编成二进制 可以看到区别 还是怎么搞了 很久不弄这个了 你可以试试 实验下

user: user-3
content: 没有调试信息，也可以用gdb调试。
user-0 提问: 如何用数组指针传值

回复:
user: user-1
content: 引用 2 楼 u011922164 的回复:果然厉害，为什么地址操作不可以，是因为分配的内存不连续吗？  p=a;  //数组a 此时退化为指针  If the type of an expression or subexpression is ``array of T,'' for some type T, then the value of the expression is a pointer to the first object in the array, and the type of the expression is altered to ``pointer to T.'' This conversion does not take place if the expression is in the operand of the unary & operator, or of ++, --, sizeof, or as the left operand of an assignment operator or the . operator. Similarly, an expression of type ``function returning T,'' except when used as the operand of the & operator, is converted to ``pointer to function returning T.''

user: user-0
content: 果然厉害，为什么地址操作不可以，是因为分配的内存不连续吗？

user: user-2
content: include <stdio.h> fun(double*p) {  double a[10]={0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0}; //p=a; //这里只是地址操作而已 memcpy((void*)p, (void*)a, sizeof(double) * 10); //用这个试试 return 0; }
user-0 提问: c语言语句理解问题

回复:
user: user-1
content: 引用 2 楼 max_min_ 的回复: int  x=10,*p=&x; // 这里首先让p指向指向x，x的内容是10 printf("%d",(*p)++);// （*p）解引用取p指向指向的内容值，                   //然后执行此语句操作后 再进行+1操作                  //所以不考虑编译环境文件，打印出来 是10 ，实际p的内容为 11;+1

user: user-2
content: 引用 5 楼 junlinfushi 的回复:[quote=引用 2 楼 max_min_ 的回复:]  int  x=10,*p=&x; // 这里首先让p指向指向x，x的内容是10 printf("%d",(*p)++);// （*p）解引用取p指向指向的内容值，                   //然后执行此语句操作后 再进行+1操作                  //所以不考虑编译环境文件，打印出来 是10 ，实际p的内容为 11;+1[/quote] +1

user: user-3
content: 先取p指向的那个东西给printf用，然后让p指向的那个东西加一。

user: user-4
content: P指向X，X=10。X++=11。

user: user-5
content: *p是取p的值。 (*p)++，这个是后缀++，会先取元素的值，等语句结束后（遇到结算点，详情看置顶贴）再进行自增运行。 所以打印的还是10，但打印后*p已经递增到11了。

user: user-6
content: 跟踪，调试，查看变量，查看内存。  不行的话就反汇编。看指令。

user: user-7
content: int  x=10,*p=&x; // 这里首先让p指向指向x，x的内容是10 printf("%d",(*p)++);// （*p）解引用取p指向指向的内容值，                   //然后执行此语句操作后 再进行+1操作                  //所以不考虑编译环境文件，打印出来 是10 ，实际p的内容为 11;

user: user-8
content: printf("%d",(*p)++); (*p)为x 的值 (*p)++相当于x++,(*p)的值(也就是x的值)+1;
user-0 提问: gcc #include与多文件编译

回复:
user: user-1
content: 一般都是丢在头文件里，然后包含头文件就好的！头文件加 重定义保护的！ 如果多处用到的宏的话，最好也放在共用的头文件里面的！ 至于多文件编译的话，可以看看makefile的基本规则依赖关系

user: user-2
content: max.h

user: user-0
content: 好了我已经知道了，不过说说你们的答案验证一下也无所谓
user-0 提问: 【救急】Sublime Text3 运行c显示Decode error - output not utf-8

回复:
user: user-0

user: user-0
content: 不行

user: user-1
content: LZ下面这个网页好像有你这个问题解决的方法 http://blog.csdn.net/chszs/article/details/8232077

user: user-0
user-0 提问: 指针的打印问题

回复:
user: user-1
content: 出现乱码是引文，返回的是局部指针的吧！函数返回的是s1的地址，局部指针！ 修改了下，看看  #include <stdio.h> #include <string.h>   char *app(char *string1, char *string2) {     char s2[20] = {0};  //  strcpy(s1,string1);     strcpy(s2,string2);      return strcat(string1,s2); }  int main(void) {     char p1[20] = "abcd";     char *p2 = "cde";     char *p;       p = app(p1,p2);     printf("%s\n", p);       return 0; }
user-0 提问: C语言求救

回复:
user: user-1
content: CSDN资源下载，搜索一下，一大堆可以下载。

user: user-2
content: 这个问题确实有点。。不好解决

user: user-3
content: 还是这个帖子啊，我怎么有看到了 你把他分成几个模块就行了，菜单，输入，查询，输出，修改，只是你需要用个文件，每次对文件进行操作，简单写写就好了，没什么意义

user: user-4
content: 这种题目资源里应该有很多吧，下一个回去简单改改就好了，有必要开价么...

user: user-0
content: 好悲伤，好悲伤

user: user-0
content: 引用 1 楼 xihu1364 的回复:1.只有40分... 2.居然还4个题目.（每题只有10分，还排除LZ可能给其他人分）  直接了当，给个价吧。论坛里肯定很多人会接活...开价是怎么开的，第一次发帖，不懂

user: user-0
content: 怎么开价的啊

user: user-5
content: 引用 3 楼 max_min_ 的回复:点这里 输入：c语言学生成绩管理系统    回车

user: user-6
content: 开价很多人都会做的，说不定很多人直接给你好几种语言的实现。

user: user-7
content: http://download.csdn.net/detail/baijiaheizhiganmao/3231044

user: user-8
content: 点这里 输入：c语言学生成绩管理系统    回车

user: user-9
content: 大家都很忙 开个价吧

user: user-5
content: 1.只有40分... 2.居然还4个题目.（每题只有10分，还排除LZ可能给其他人分）  直接了当，给个价吧。论坛里肯定很多人会接活...
user-0 提问: 求C语言下改文件名或改目录名的函数

回复:
user: user-1
content: 引用 3 楼 max_min_ 的回复:  #include <stdio.h>  int rename(const char *oldpath, const char *newpath); 学习了

user: user-2
content: #include <stdio.h>  int rename(const char *oldpath, const char *newpath);

user: user-3
content: 调用stdlib头文件中的system函数， system函数原型 int system (const char *str) system自动把str指向的字符串发送给系统的命令解释器， win下为dos， linux下为系统shell，也就是说在system形参中写改文件名的相应命令。  实例： linux bash ：   #include <stdlib.h>  int main () {    system("mv /home/john/123.cpp /home/john/999.cpp");     return 0; } 把文件名123改为999  也可加入命令行参数修改程序 使得程序专门用来作为修改文件名 不过实质还是调用系统命令

user: user-4
content: http://zhidao.baidu.com/link?url=TFN-qHQ62Y1UwpDxA9sRayX1oxgPP4eyYgt_9p0lnk7mtDFDY8IOqzXlUWY1WNrhZTsj_zM-_iasMNpocA5H_K
user-0 提问: 指针赋值 warning: assignment from incompatible pointer type

回复:
user: user-1
content: 去掉   -Wold-style-cast        Warn if a C style cast is used in a program

user: user-1
content: 引用 3 楼 oN5GrzoN 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] VC6和VS2010都编译通过无警告错误。 gcc 有啊[/quote]   -Wno-traditional          Do not warn about traditional C

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:VC6和VS2010都编译通过无警告错误。 gcc 有啊

user: user-2
content: 可以忽视掉！没有关系！

user: user-1
content: VC6和VS2010都编译通过无警告错误。
user-0 提问: 实参可以是任意类型吗

回复:
user: user-1
content: 据我所学到的知识，形参和实参的类型，数量都要保持一致。 只不过形参是自己定义的。

user: user-2
content: 自己写demo测试吧！

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

user: user-3
content: 编译器说了算。
user-0 提问: 有人会matlab的么？高分求救啊

回复:
user: user-0
content: 来人啊  别就这么沉了啊

user: user-0
content: 引用 2 楼 N_sev7 的回复:下一本关于matlab编程的书，找一找实例应该是没有，要不就是相当不好找，明天就要交作业了，求帮忙啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

user: user-0
content: 引用 1 楼 wangdahu888 的回复:不是有内置函数吗？ 好像是dct2()，具体记不清了，找一本MATLAB图像处理书查查就知道了这还是别人问我的，我完全没学过，他那边学了跟我没学一个样，明天他就得交作业……好不容易有人回复了，能说说具体解答下么，求帮忙啊

user: user-1
content: 下一本关于matlab编程的书，找一找实例

user: user-2
content: 不是有内置函数吗？ 好像是dct2()，具体记不清了，找一本MATLAB图像处理书查查就知道了
user-0 提问: 问个C语言符号表的问题

回复:
user: user-1
content: 符号名称只是代表地址，楼主说的 i，就是代表一个地址空间。 上面几位说的对，i只是给编译器来用的，方便编程者。你如果接触过反汇编，就很容易明白这个道理。

user: user-2
content: 还有，所有的符号都会有自己的符号表，常数表，变量名表，数组名表等等。自己去看下编译原理，上面应该有讲的。

user: user-2
content: 变量名只是给内存空间起了一个名字，方便你使用。不要想着存放在哪里，没有意义，除非你是做编译器开发的。  如果你一定要想知道的话，就去看下编译原理吧。编译器会生成一张符号表，符号表有相关的信息，变量名对应的地址什么的。至于这张表存在哪个内存分区我也不太清楚。

user: user-3
content: 解释执行，符号表，可能和程序在一起，也可能在解释器内部。 编译执行，符号表只是编译器需要，应用程序，就不需要了。  编译以后，符号表基本上就丢弃了。

user: user-4
content: 变量实际上是一段内存，变量名就是内存的名字，只要知道的实际地址，其名字也就没有存在的价值了

user: user-5
content: i 只是给编译器用的, 制品里头的 i 是作为辅助信息用, 对运行无意义. 都是数据, 有的是数据, 有的是地址.

user: user-6
content: 存储变量的四个区： 常量区：常量存放处 静态区：静态变量，全局变量等存放处 栈区：局部变量等存放区 堆区：申请的内存。

user: user-7
content: 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对应的汇编并单步执行观察相应内存和寄存器变化。）  弄清楚编译期和运行期的区别。  了解一下gcc源代码，嫌大的话换Tiny C Compiler也行。
user-0 提问: 不知道如何查程序哪里重复定义，希望大家能够指点一下。

回复:
user: user-0
content: project该如何设置呢

user: user-0
content: 重建所有是什么意思？

user: user-1
content: 有多个 main, 是否project 设置有问题

user: user-2
content: 重建所有

user: user-3

user: user-3
content: 引用 2 楼 u012523688 的回复:大概就是这个样子 1>  ConnectTest.vcxproj -> D:\Personal\Administrator\桌面\新建文件夹 (2)\ConnectTest\Debug\ConnectTest.exe 1>FinalizeBuildStatus: 1>  Deleting file "Debug\ConnectTest.unsuccessfulbuild". 1>  Touching "Debug\ConnectTest.lastbuildstate". 1> 1>Build succeeded. 1> 1>Time Elapsed 00:00:02.49 ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========   这是我编译的结果  编译成功

user: user-0
content: 大概就是这个样子

user: user-4
content: 直接编译看哪报错，根据报错信息改
user-0 提问: 不知道学什么语言好？

回复:
user: user-1
content: 哪个喜欢学哪个

user: user-2
content: Windows :C++ Web:C# Mobile：Java

user: user-3
content: 有了C基础，先学C++吧，通用性强一些，既是面向对象，又能掌握细节（比如内存模型），学会了上手其它语言就很容易了。不一定要看大部头的C++ Primer，清华郑莉的教材我感觉也不错，可以先看打下基础。

user: user-0
content: 引用#6 为什么建议学cmd下的批处理命令？

user: user-0
content: #6 为什么建议学cmd下的批处理命令？

user: user-4
content: 引用 7 楼 maoshuoqiong 的回复:站在那儿别动，伙计！ 瞧你那一脸邋遢的络腮胡... 那两根吊带，还有那洋洋得意的表情。 十足一副高人一等的UNIX电脑用户的样子！   都可以！兴趣喜欢那个就钻研那个！都学也可以的！

user: user-5
content: 站在那儿别动，伙计！ 瞧你那一脸邋遢的络腮胡... 那两根吊带，还有那洋洋得意的表情。 十足一副高人一等的UNIX电脑用户的样子！

user: user-6
content: 建议学cmd下的批处理命令。

user: user-7
content: 英语是基本,学点法语日语的,肯定吃香

user: user-8
content: C语言+数据结构+操作系统+算法设计  学通了基本可以毕业工作了 平台和业务相关的就很多方向了，这是最基础的 java或C++ + 面向对象程序设计+模式应用  脱离了底层，更多的注意是高层处理上 看你喜欢哪个方向了 其他的没怎么接触过，很多语言都是类C语言的 PHP貌似...只是听说，你把我说的话当做听说就行了

user: user-9

user: user-10
content: 你要先清楚自己的需求，什么方面的？ web的话有ASP.NET、Java、PHP 手机有Objective-C、Java等 不一一列举了。

user: user-11
content: 用途不同，没有哪个好不好 不过英语肯定不错的
user-0 提问: 这个函数存在什么问题？

回复:
user: user-1
content: fp没问题，buf有问题，出了函数就没了的东西。

user: user-2
content: FILE *open_data(void) {     FILE *fp;     static char buf[BUFSIZ];      if (NULL == (fp=fopen("2.in", "r"))) {         return (NULL);     }     if (0!=setvbuf(fp, buf, _IOLBF, BUFSIZ)) {         fclose(fp);         return (NULL);     }     return (fp); }

user: user-3
content: buf是局部变量，离开后FILE内部操作就非法操作了。  另外if(setvbuf(fp, buf, _IOLBF, BUFSIZ) != 0)         return (NULL);  没有关闭fp。

user: user-4
content: 局部变量释放的问题，建议去看看《c程序设计语言》，很经典的一本书

user: user-5
content: 高质量 C++& C 编程指南 有详细解释

user: user-6
content: 引用 楼主 qdlgdx_lsy 的回复:这是unix环境高级编程中的一个函数：  FILE *open_data(void) { 	FILE *fp; 	char buf[BUFSIZ]; 	if((fp=fopen("2.in", "r")) == NULL) 		return (NULL); 	if(setvbuf(fp, buf, _IOLBF, BUFSIZ) != 0) 		return (NULL);	 	return (fp); } 这个函数存在什么问题呢？  问题在char buf[BUFSIZ]上吧，你打开文件指针，设置buf缓冲区，当出了这个函数后，buf会被释放，外部对文件指针的操作会出现错误吧！

user: user-7
content: 引用 5 楼 cfjtaishan 的回复:[quote=引用 1 楼 turingo 的回复:] fp是局部变量，函数返回后其内容是不受控制的。  [quote=引用 楼主 qdlgdx_lsy 的回复:] 这是unix环境高级编程中的一个函数：  FILE *open_data(void) { 	FILE *fp; 	char buf[BUFSIZ]; 	if((fp=fopen("2.in", "r")) == NULL) 		return (NULL); 	if(setvbuf(fp, buf, _IOLBF, BUFSIZ) != 0) 		return (NULL);	 	return (fp); } 这个函数存在什么问题呢？[/quote] 这个可以返回fp，FILE是全局的，只不过fp指针变量时局部的，在调用函数里可以定义另一个FILE*类型的指针，用于接收它。 setvbuf是用于设置缓冲区的。[/quote]+1

user: user-8
content: man setbuf         You must make sure that both buf and the space it points to still exist by the  time  stream  is  closed,        which also happens at program termination.         For example, the following is illegal:         #include <stdio.h>        int main()        {            char buf[BUFSIZ];            setbuf(stdin, buf);            printf("Hello, world!\n");            return 0;        }

user: user-9
content: 引用 1 楼 turingo 的回复:fp是局部变量，函数返回后其内容是不受控制的。  [quote=引用 楼主 qdlgdx_lsy 的回复:] 这是unix环境高级编程中的一个函数：  FILE *open_data(void) { 	FILE *fp; 	char buf[BUFSIZ]; 	if((fp=fopen("2.in", "r")) == NULL) 		return (NULL); 	if(setvbuf(fp, buf, _IOLBF, BUFSIZ) != 0) 		return (NULL);	 	return (fp); } 这个函数存在什么问题呢？[/quote] 这个可以返回fp，FILE是全局的，只不过fp指针变量时局部的，在调用函数里可以定义另一个FILE*类型的指针，用于接收它。 setvbuf是用于设置缓冲区的。

user: user-10
content: 问题出在 char buf[BUFSIZ];  buf是局部变量，缓冲区设置一个失控的位置上了，fp应该没有问题，它指向的位置应该在全局堆上

user: user-11
content: 引用 1 楼 turingo 的回复:fp是局部变量，函数返回后其内容是不受控制的。  [quote=引用 楼主 qdlgdx_lsy 的回复:] 这是unix环境高级编程中的一个函数：  FILE *open_data(void) { 	FILE *fp; 	char buf[BUFSIZ]; 	if((fp=fopen("2.in", "r")) == NULL) 		return (NULL); 	if(setvbuf(fp, buf, _IOLBF, BUFSIZ) != 0) 		return (NULL);	 	return (fp); } 这个函数存在什么问题呢？[/quote] +1  绝对不能返回局部变量的指针，即使是malloc的指针最好也不要返回，不然忘记free了会内存泄漏的。

user: user-12
content: 不知道buf是用来干嘛的

user: user-13
content: fp是局部变量，函数返回后其内容是不受控制的。  引用 楼主 qdlgdx_lsy 的回复:这是unix环境高级编程中的一个函数：  FILE *open_data(void) { 	FILE *fp; 	char buf[BUFSIZ]; 	if((fp=fopen("2.in", "r")) == NULL) 		return (NULL); 	if(setvbuf(fp, buf, _IOLBF, BUFSIZ) != 0) 		return (NULL);	 	return (fp); } 这个函数存在什么问题呢？
user-0 提问: 常量操作数的算术运算

回复:
user: user-1
content: 应该跟编译器有关,有的(我想应该是大多数)编译器可能直接把它忽略了

user: user-2
content: 这个连汇编语言也有可能，直接计算为 7. 何况C,C++

user: user-3
content: 常量折叠，大概就算不优化也看不到3＋4，直接就是7

user: user-4
content: 编译器优化，就没这句话了，汇编中就直接忽视吧。
user-0 提问: 一个c语言问题,困惑

回复:
user: user-1
content: 这里既可以是3 4也可以是4 3，看你做什么，因为它和前面那个4压根没有任何关系。

user: user-2
content: 有什么区别吗，没看出来，地址是连续的

user: user-3
content: 引用 8 楼 AnYidan 的回复:指针也有类型，c++ 的 编译器会检查类型是否匹配  int (*a)[4] a 是一个指针，指向一个4个元素的一维数组  int (*a)[4] a 是一个指针，解运算后 指向一个4个元素的一维数组

user: user-3
content: 指针也有类型，c++ 的 编译器会检查类型是否匹配  int (*a)[4] a 是一个指针，指向一个4个元素的一维数组

user: user-4
content: 一般是int (*a)[3]= new int[3][4]; 但是int (*a)[4]= new int[3][4];多定义一个单元，也无所谓，反正够用，那个不过是多出来的

user: user-0
content: int (*a)[4]= new int[3][4];//这条语句不会抛错 int (*a)[4] = new int[4][3]; //这条语句会抛错  使用的是DevC++编译器

user: user-5
content: 没这样用过！分配的时候都是和前面对应起来的！ 但是如果从地址连续上面来讲的话，应该效果是一样的！

user: user-6
content: 这里既可以是3 4也可以是4 3，看你做什么，因为它和前面那个4压根没有任何关系。

user: user-7
content: 没这样用过，是不是为int的指针数组（4个单元），为数组每个单元申请三个int单元？
user-0 提问: 请教大牛们一个算法问题

回复:
user: user-1
content: C++  //这个是 模仿 C++库函数写的 inline unsigned int countBitsHalfByte(unsigned char x){             //  0 1 2 3 4 5 6 7 8 9 a b c d e f     return "\0\1\1\2\1\2\2\3\1\2\2\3\2\3\3\4"[x]; } inline unsigned int countBitsByte(unsigned char x){     return countBitsHalfByte(x& 0xF) +countBitsHalfByte((x&0xF0)>>4); }  template<typename intT >unsigned int countBits(intT x){     int n=0;     union{ intT d;unsigned char by[sizeof(x)];}v;     v.d =x;     for(int i = 0;i < sizeof(x); i++){         n +=countBitsByte(v. by[ i ]);     }     return n; }  int32_t tab_all_1[] =        { 0,          0x00000001,0x00000003,0x00000007,0x0000000f,0x0000001f,0x0000003f,0x0000007f,0x000000ff,          0x000001ff,0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff,0x00007fff,0x0000ffff,          0x0001ffff,0x0003ffff,0x0007ffff,0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff,          0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff,        };

user: user-2
content: 某些  mcu 中有一个求前导零的指令

user: user-2
content: 引用 7 楼 breakfisher 的回复:谢谢哈！ 这个还是需要循环吧  [quote=引用 5 楼 AnYidan 的回复:]  int lowbit(int x)  { 	return (x & (-x)); }   --网上的一个函数，可以返回 x 最低位是 0 还是 1  同时右移 data 和 mask_flag，当mask_flag的最低位是1时，记录data 的最低位并计算[/quote]  只是一段合用的程序，mcu 中有一个求前导零的指令，对数字的前导零进行计数，并将结果返回，虽然可能仍需用到循环，但应该可以大幅提高效率

user: user-1
content: 引用 6 楼 breakfisher 的回复:恩，谢谢！ 考虑过查表， 表要是二维的， 现在只需要8位， 但是担心后面位数多了不好扩展  [quote=引用 4 楼 lm_whales 的回复:] 对于你这个只有5位或者8位的，可以生成一个表，然后查表。 如果位数较多，就不好使用。 [/quote] 想到一个查表方法，不一定比移位逐位处理快 位数比较多，表里可以同时有1的个数和最后的结果值 然后合并每个字节的结果。

user: user-0
content: 谢谢哈！ 这个还是需要循环吧  引用 5 楼 AnYidan 的回复: int lowbit(int x)  { 	return (x & (-x)); }   --网上的一个函数，可以返回 x 最低位是 0 还是 1  同时右移 data 和 mask_flag，当mask_flag的最低位是1时，记录data 的最低位并计算

user: user-0
content: 恩，谢谢！ 考虑过查表， 表要是二维的， 现在只需要8位， 但是担心后面位数多了不好扩展  引用 4 楼 lm_whales 的回复:对于你这个只有5位或者8位的，可以生成一个表，然后查表。 如果位数较多，就不好使用。

user: user-3
content: 这个用嵌入汇编实现即可。

user: user-0
content: 一楼这个不对，  发现例子里面漏了一个字， 更正一下 例1： data ：  10001 mask_flag  10101 这样结果就是取出data的1,3,5位的数值为101,值为5  例2： data ：  10001 mask_flag  10111 这样结果就是取出data的1,2,3,5位的数值为1001,值为9

user: user-4
content: n=data &  mask_flag;// 10001 //mask_flag  10101

user: user-2
content: int lowbit(int x)  { 	return (x & (-x)); }   --网上的一个函数，可以返回 x 最低位是 0 还是 1  同时右移 data 和 mask_flag，当mask_flag的最低位是1时，记录data 的最低位并计算

user: user-1
content: 对于你这个只有5位或者8位的，可以生成一个表，然后查表。 如果位数较多，就不好使用。

user: user-5
content: 必须用到循环：  int extract(int data, int mask) { 	int value = 0; 	int i; 	int j = 0;  	for(i = 0; i < 32; i++) 	{ 		if(mask & (1 << i)) 		{ 			if(data & (1 << i)) 				value |= 1 << j; 			j++; 		} 	}  	return value; }  引用 楼主 breakfisher 的回复:给定一个二进制数data， 要取出对应mask_falg上值为1的位组成一个新数， 比如：  例1： data ：  10001 mask_flag  10101 这样结果就是取出data的1,3,5的数值为101,值为5  例2： data ：  10001 mask_flag  10111 这样结果就是取出data的1,2,3,5的数值为1001,值为9   有没有不需要循环， 直接通过位运算就可以得出结果的方法？
user-0 提问: 这个程序为什么不能正常工作？

回复:
user: user-1
content: fopen不是2.txt 什么时候变成.in了 windows识别后缀名  linux下 不识别后缀名 俩个操作系统的机制是不同的  这个为什么是这样 你可以在开个帖子 给予解释 这不是一个小问题

user: user-1
content: 我想关键的地方应该在这 如果在windows和linux都能编译通的话 问题可能是这里  if((fp=fopen("2.in", "r")) == NULL)  就是当前目录问题 windows是集成环境你可能放错位置了 写绝对路径测试下 当然如果是菜鸟的话  绝对路径写对也可能是个问题 因为它们有的不懂转义字符 而在linux下的 shell 你是用命令操作的 当然 你不会在这个目录下编译.c 之后你在cd 到另一个目录下 vi 2.in

user: user-2
content: 楼主你返回局部指针变量的目的是什么
user-0 提问: 问一个C primer plus程序在VS中运行问题

回复:
user: user-1
content: 引用 5 楼 manjucaka 的回复:引用 4 楼 max_min_ 的回复:[quote=引用 2 楼 manjucaka 的回复:] [quote=引用 1 楼 czarten 的回复:] 你定义的fp是什么类型？FILE *fp if(fp = fopen(file, "rb") ==NULL)  改成  if((fp = fopen(file, "rb")) ==NULL) [/quote] 不行，应该是编译器的问题吧，在VC6.0上可以运行，就是不能打开文件[/quote] windows下路径要记得 加双斜杠的哦！例如：D:\\test.txt

user: user-0
content: 引用 4 楼 max_min_ 的回复:引用 2 楼 manjucaka 的回复:[quote=引用 1 楼 czarten 的回复:] 你定义的fp是什么类型？FILE *fp if(fp = fopen(file, "rb") ==NULL)  改成  if((fp = fopen(file, "rb")) ==NULL) [/quote] 不行，应该是编译器的问题吧，在VC6.0上可以运行，就是不能打开文件

user: user-1
content: 引用 2 楼 manjucaka 的回复:引用 1 楼 czarten 的回复:你定义的fp是什么类型？FILE *fp if(fp = fopen(file, "rb") ==NULL)  改成  if((fp = fopen(file, "rb")) ==NULL)

user: user-2
content: 难道是这个？ (fp=fopen(...))==null

user: user-3
content: 引用 4 楼 max_min_ 的回复:引用 2 楼 manjucaka 的回复:[quote=引用 1 楼 czarten 的回复:] 你定义的fp是什么类型？FILE *fp if(fp = fopen(file, "rb") ==NULL)  改成  if((fp = fopen(file, "rb")) ==NULL) [/quote]  ==的优先级比=高

user: user-0
content: 引用 1 楼 czarten 的回复:你定义的fp是什么类型？FILE *fp

user: user-2
content: 你定义的fp是什么类型？
user-0 提问: 请教个问题

回复:
user: user-1
content: 都不完全支持的吧!可以考虑换个环境的、、

user: user-2
content: 可以挂接第三方编译器，比如GNUC  http://stackoverflow.com/questions/14768073/how-to-use-gcc-with-microsoft-visual-studio

user: user-3
content: 之前的帖子 http://bbs.csdn.net/topics/380160403

user: user-3
content: 没办法，微软又不做，C99又不是库，你要用其他编译器那就不属于VS了，节哀吧
user-0 提问: openssl的AES解密算法的EVP_DecryptFinal_ex(&ctx,out+outl,&outltmp);的使用

回复:
user: user-1
content: 楼主，问题解决了吗？

user: user-1
content: 那这个怎么处理，一旦遇上16的倍数，后面的块就解密不出来了？  引用 4 楼 hhh_yang 的回复:楼主颤一下outl的值，应该是16的倍数，所以没有padding，所以final函数可加密的padding，所以outltmp值为0这个

user: user-2
content: 楼主颤一下outl的值，应该是16的倍数，所以没有padding，所以final函数可加密的padding，所以outltmp值为0

user: user-3
content: 我也遇到了。。

user: user-4
content: man EVP_DecryptFinal_ex

user: user-5
content: 将那个evp_decryptfinal_ex函数注释掉试试
user-0 提问: C语言++和--运算符问题

回复:
user: user-1
content: 引用 楼主 u010133536 的回复:#include<stdio.h> int main(void) { 	int x=8; 	for(;x>0;x--) 	{ 		if(x%3) 		{ 			printf("%d,",x--); 			continue; 		} 		printf("%d,",--x); 	} 	return 0; } 为什么输出的第一个结果为8，谢谢  曾经有和你一样的想法，楼主同学！ 因为for循环里的x--实在执行完printf函数后才去执行的！

user: user-2
content: 引用 1 楼 max_min_ 的回复:http://bbs.csdn.net/topics/370153775 看看置顶帖！何必为难自己！以后我也会想不透，多用几个编译器也就不想了！ 也不会写那样的代码了！和置顶说的 没关系  楼主的代码 也不涉及UB 这里输出 8 只是因为 i-- 求值结果 的的确确是 8

user: user-3
content: 好吧，是8啊，有为什么？

user: user-4
content: x--,是先取 X 的值后再 --；  --x 是先--，再来取 X

user: user-5
content: x=8，x%3=2//true 执行printf("%d,",x--);输出8，,x变为7 continue语句继续执行 x=7，x%3=1；输出7，x变为6 x=6，x%3=0//flase 执行printf("%d,",--x);输出5，x变为5

user: user-6
content: 第一个结果为8 只要知道第一次执行那个输出语句，自然就明白了 8 %3 = 2 // true  if(x%3){ printf("%d",x--); //x-- 先得到 x 的当前值8，用于输出，再执行自减操作。 //输出结果自然就是 8了。 }  当然，你这个程序的代码风格，不是太好。 估计你自己，对于这个代码的逻辑，也是比较糊涂的。

user: user-7
content: 因为你有continue;语句，然后执行了for(;x>0;x--)中的X--语句。

user: user-8
content: http://bbs.csdn.net/topics/370153775 看看置顶帖！何必为难自己！以后我也会想不透，多用几个编译器也就不想了！ 也不会写那样的代码了！

user: user-9
content: .。。。。。。。。。。。。。。。。第一个结果输出8不是很明显的结果？详情见3L

user: user-10
content: ++, -- 浪费了多少光阴

user: user-11
content: 引用 3 楼 lm_whales 的回复:第一个结果为8 只要知道第一次执行那个输出语句，自然就明白了 8 %3 = 2 // true  if(x%3){ printf("%d",x--); //x-- 先得到 x 的当前值8，用于输出，再执行自减操作。 //输出结果自然就是 8了。 }  当然，你这个程序的代码风格，不是太好。 估计你自己，对于这个代码的逻辑，也是比较糊涂的。

user: user-12
content: 引用 3 楼 lm_whales 的回复:第一个结果为8 只要知道第一次执行那个输出语句，自然就明白了 8 %3 = 2 // true  if(x%3){ printf("%d",x--); //x-- 先得到 x 的当前值8，用于输出，再执行自减操作。 //输出结果自然就是 8了。 }  当然，你这个程序的代码风格，不是太好。 估计你自己，对于这个代码的逻辑，也是比较糊涂的。 ++
user-0 提问: 请帮我解释一下这个scanf的读取方法

回复:
user: user-0
content: 我明白了，书上有一句话我开始没有理解到。“如果您使作带有多个说明符的scanf()语句，ANSI C 要求函数在第一个出错的地方停止读入。”这时再看我的这个程序确实在第一个出错的地方停止读入。

user: user-1
content: 查看一下scanf() 函数的返回值，估计你就应该明白了。

user: user-2
content: 因为你输入数据，以ENTER键结束输入时，它把ENTER键当做CH输入值，ENTER在系统里当成0

user: user-3
content: 一下是个参考代码： #include "stdafx.h" #include "stdio.h"  int main(void) { 	int a, b; 	char ch;  	scanf("%d%c%d", &a, &ch, &b); 	printf("a = %d b = %d ch = %c\n", a, b, ch); 	 	return 0; }  输入 &　输出： 12ah a = 12 b = -858993460 ch = a
user-0 提问: UDP C/S模型实现问题

回复:
user: user-1
content: udp是无连接的！所以不需要后台接受数据什么的！需要的时候就直接发送接受就好！

user: user-2
content: 你的描述可以实现 但是跨网段会出现问题，内网，或者本机是可以的 具体怎么设置，一样的 将所有客户端都增加服务端接受的功能  跨网段的话 就需要各自穿透技术了..楼主自行查阅相关资料

user: user-3
content: UDP 是非面向连接的干嘛还接收客户端的请求再处理数据再发送数据给客户端呢？ UDP 不是以广播的形式发送数据到互联网上，然后就不用管数据的流向了吗？ 如果要阻塞等待客户端的请求的话那应该用TCP面向连接的SOCKET啊。！
user-0 提问: signed关键字的目的

回复:
user: user-1
content: “就想明确的告诉你是有符号的”

user: user-2
content: 我觉得这是为标准定义的严密性考虑的 万一哪天int默认表示的是unsigned int 那么signed关键字就是必要的了

user: user-3
content: signed 是默认的有符号的；unsigned 才是要注意的 正符号

user: user-4
content: 关键是编译器可以指定默认char是unsigned或signed cl.exe:   /J default char type is unsigned    gcc/g++:   -fsigned-char           Make 'char' be signed by default   -funsigned-char         Make 'char' be unsigned by default

user: user-5
content: 其实也就跟char有关（实际主流编译器char都是当signed char 处理的），其他用跟不用无所谓 还有一个类似关键字auto也一样很少用了

user: user-6
content: 丢到内存中 不都是一堆01吗 只是你想让计算机怎么来解释这串数据的问题而已

user: user-7
content: 貌似标准没有规定char是signed还是unsigned的。

user: user-1
content: 另外char默认不是signed char 而且char、signed char、unsigned char是不一样的类型（很奇怪，也没搞懂标准怎么想的）

user: user-8
content: 引用 2 楼 Adol1111 的回复:[quote=引用 1 楼 user-11 的回复:] 就是有符号类型的！只不过默认情况下都是signed所以就没有写而已！ 目的就是告诉有符号类型的啊 +1[/quote]+1

user: user-9
content: 为了强调  如果你使用有符号整数，建议写上

user: user-10
content: 引用 1 楼 user-11 的回复:就是有符号类型的！只不过默认情况下都是signed所以就没有写而已！ 目的就是告诉有符号类型的啊 +1

user: user-11
content: 就是有符号类型的！只不过默认情况下都是signed所以就没有写而已！ 目的就是告诉有符号类型的啊
user-0 提问: 一家人

回复:
user: user-0
content: 非常感谢，能加一下你Q吗？

user: user-1
content: #include <stdio.h>  int main(void) { 	int   N, M, Q; 	int   p, i, j, a, b; 	/* 用二维表来表示a和b之间的关系，0表示没有关系，1表示有关系 */ 	int   buf[100][100] = {0};  	scanf("%d%d%d", &N, &M, &Q); 	for (p = 0; p < M; p++) { 		scanf("%d%d", &a, &b); 		/* a和b有关系，则b和a也有关系 */ 		buf[a-1][b-1] = 1; 		buf[b-1][a-1] = 1; 		/* 对于每次输入，检测a和b与其他人的关系 */ 		for (i = 0; i < N; i++) { 			for (j = 0; j < N; j++) { 				/* 检测a行关系 */  				if (buf[a-1][i] == 1 && buf[a-1][j] == 1) 					buf[i][j] = 1; 				/* 检测b行关系 */  				if (buf[b-1][i] == 1 && buf[b-1][j] == 1) 					buf[i][j] = 1;	 			} 		} 	} 	 	for (p = 0; p < Q; p++) { 		scanf("%d%d", &a, &b); 		if (buf[a-1][b-1]) 			printf("Yes\n"); 		else 			printf("No\n"); 	}  	return 0;	 }  /* 输出结果： 3 1 2 1 2 1 2 Yes 1 3 No */
user-0 提问: 求大神帮忙

回复:
user: user-1
content: 没有 qq

user: user-0
content: 能不能加个qq：568519177，方便问问题

user: user-1
content: 如果中断过快影响别的，也可以改  if(v==2)  或 miao +=10; if(miao > = 60) {miao -= 60; ...}

user: user-1
content: 判断按键 if (按键压下）  {   TH0=(65536-5000)/256;   TL0=(65536-5000)%256; //定时器初值，定时5ms（12M晶振） } else {   TH0=(65536-50000)/256;   TL0=(65536-50000)%256; //定时器初值，定时50ms（12M晶振） }

user: user-0
content: #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar v,miao,fen,shi; sbit  add=P1^3;//加速度键 uchar code table[]={  0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; void display(uchar miao,uchar fen,uchar shi); void delay(uint ); void little(); void main() {    little();//初始化子程序   miao=0;   shi=0;   fen=0;   while(1)   {    display(miao,fen,shi);    if(v==20)      {   miao++;   v=0;   if(miao==60)   {    fen++;  //  满60S, 分加1,秒清0    miao=0;    if(fen==60)     {      shi++; // 小时加1      fen=0;      if(shi==24)  	 shi=0; //小时满     }    }  }   }  } void delay(uint z) {   uint i,j;   for(i=z;i>0;i--)    for(j=110;j>0;j--); } void display(uchar miao,uchar fen,uchar shi)  //  显示子函数 {     P2=0x7f;   P0=table[miao%10];   delay(1);     P2=0xbf;   P0=table[miao/10];   delay(1);       P2=0xdf;   P0=0x40;   delay(1);    P2=0xef;   P0=table[fen%10];   delay(1);      P2=0xf7;   P0=table[fen/10];   delay(1);      P2=0xfb;   P0=0x40;   delay(1);    P2=0xfd;   P0=table[shi%10];   delay(1);       P0=0x30;          P2=0xfe;   P0=table[shi/10];    delay(1); } void little()   // 初始化子函数 {   TMOD=0x01;  TH0=(65536-50000)/256;  TL0=(65536-50000)%256; //定时器初值，定时50ms（12M晶振）  EA=1;  ET0=1;  TR0=1;  } void timer0() interrupt 1 //定时计数器中断 {  TH0=(65536-50000)/256;  TL0=(65536-50000)%256;   v++;    } 代码已上传，求大神帮帮忙

user: user-1
content: 引用 2 楼 u012887645 的回复:能不能写个程序给我呢，我新手，谢谢   你上传代码，会有人帮你改的

user: user-0
content: 能不能写个程序给我呢，我新手，谢谢

user: user-2
content: 时钟的写好了的话，按键调整速度应该很好写啊
user-0 提问: socket编程转换函数的问题？

回复:
user: user-0
content: 引用 1 楼 hnwyllmm 的回复:for(power=1;j>=10;j/=10)      power*=10; 循环结束后power就变成i的位数^power了，比如293，power就是100  for(;power>0;power/=10)    {      *string++='0'+i/power;      i%=power;    } 每次取出来第一位，转换成数字字符 明白了。。谢谢讲解！！！

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。 可是如果底子比较薄的话，我觉得还是需要别人给个提示和大致的思考方向的

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-2
content: for(power=1;j>=10;j/=10)      power*=10; 循环结束后power就变成i的位数^power了，比如293，power就是100  for(;power>0;power/=10)    {      *string++='0'+i/power;      i%=power;    } 每次取出来第一位，转换成数字字符
user-0 提问: 帮个小忙!一个简单的C语言程序

回复:
user: user-1
content: 引用 10 楼 u012877259 的回复:先看一些入门书籍再来练手吧 +1

user: user-2
content: 先看一些入门书籍再来练手吧

user: user-3
content: #include <stdio.h> int main(void) { 	char ch;         while (scanf("%c", &ch) )     {         getchar();         printf("%d\n", ch);     } 	return 0; }

user: user-4
content: 引用 6 楼 max_min_ 的回复:先找一本c语言的基础书籍看看基本的理论知识再动手吧！ +1

user: user-5
content: 引用 1 楼 cfjtaishan 的回复:#include <stdio.h>  int main(int argc, char *argv[]) { 	char ch; 	int rtval = -1; 	 	while ((rtval = scanf("%c", &ch)) == 1) 	{ 		getchar();    //接收换行符 		fprintf(stdout, "%d\n", ch); 	} 	return 0; }

user: user-6
content: 先找一本c语言的基础书籍看看基本的理论知识再动手吧！

user: user-7
content: char ch; scanf("%c", &ch); printf("%d",ch);  不知道会不会把char里的'/0'也打出来

user: user-8
content: 引用 2 楼 u012887866 的回复:谢谢你的解答 但是不太懂stdout是什么意思 为什么= -1 呢???才学C不久 看一下scanf的返回值。若stdout（Standard Output)不是特别懂，那么就用printf吧。

user: user-9
content: 标准输出，通常就是你的屏幕

user: user-0
content: 谢谢你的解答 但是不太懂stdout是什么意思 为什么= -1 呢???才学C不久

user: user-8
content: #include <stdio.h>  int main(int argc, char *argv[]) { 	char ch; 	int rtval = -1; 	 	while ((rtval = scanf("%c", &ch)) == 1) 	{ 		getchar();    //接收换行符 		fprintf(stdout, "%d\n", ch); 	} 	return 0; }
user-0 提问: 帮忙一下！！！

回复:
user: user-1
content: 就是一个编码的转换吧！

user: user-2
content: //GBK汉字内码范围（不包括A1xx～A9xx的标点符号英文字母特殊符号等）    //区码  ,位码    //81-A0 ,40-7E 80-FE    //AA-AF ,40-7E 80-A0    //B0-D6 ,40-7E 80-FE    //D7    ,40-7E 80-F9    //D8-F7 ,40-7E 80-FE    //F8-FE ,40-7E 80-A0

user: user-3
content: /*区码=内码(高字节)-160  位码=内码(低字节)-160*/ /*10进制的160等于16进制的A0*/ /*获得区码与位码*/ /*计算该汉字在字库中偏移量*/  /*将文件指针移动到偏移量的位置*/
user-0 提问: 求助：一个超简单的宏定义。

回复:
user: user-1
content: 引用 9 楼 u012559195 的回复:[quote=引用 8 楼 caojian005 的回复:] 可以跑下 UNUSED(x)+1看结果，反正不这么用 #define UNUSED(x) ((x)=(x))  #define UNUSED(x) (x)=(x)  运行了一下，这两种用法没什么差别。[/quote] #define UNUSED1(x) ((x)=(x))  #define UNUSED2(x) (x)=(x) int iBuf = 0; UNUSED1(iBuf)+1; cout<<iBuf<<endl; UNUSED2(iBuf)+1; cout<<iBuf<<endl;

user: user-2
content: 引用 6 楼 Adol1111 的回复:[quote=引用 5 楼 derekrose 的回复:] [quote=引用 4 楼 u012559195 的回复:] [quote=引用 1 楼 user-8 的回复:] 避免一些编译器的警告。 对于未使用的变量，很多编译器都会警告“未使用的变量x”。 但是它没有赋值，这样它自己赋值给自己，这样不会有问题吗？[/quote] 这就是赋值了[/quote] +1 虽然赋的值无法预料，但就是赋值。只要你不直接用这些变量就没事了，主要就是消除编译器警告。[/quote]+1

user: user-3
content: 有些编译器，你定义了变量，没去赋值的话，它会有警告

user: user-4
content: 主要是为了避免编译器和lint的告警，也有这样写的 #define UNUSED(x) ((void)(x))

user: user-0
content: 引用 8 楼 caojian005 的回复:可以跑下 UNUSED(x)+1看结果，反正不这么用 #define UNUSED(x) ((x)=(x))  #define UNUSED(x) (x)=(x)  运行了一下，这两种用法没什么差别。

user: user-1
content: 可以跑下 UNUSED(x)+1看结果，反正不这么用 #define UNUSED(x) ((x)=(x))  #define UNUSED(x) (x)=(x)

user: user-0
content: OK，谢谢大家。

user: user-5
content: 引用 5 楼 derekrose 的回复:[quote=引用 4 楼 u012559195 的回复:] [quote=引用 1 楼 user-8 的回复:] 避免一些编译器的警告。 对于未使用的变量，很多编译器都会警告“未使用的变量x”。 但是它没有赋值，这样它自己赋值给自己，这样不会有问题吗？[/quote] 这就是赋值了[/quote] +1 虽然赋的值无法预料，但就是赋值。只要你不直接用这些变量就没事了，主要就是消除编译器警告。

user: user-6
content: 引用 4 楼 u012559195 的回复:[quote=引用 1 楼 user-8 的回复:] 避免一些编译器的警告。 对于未使用的变量，很多编译器都会警告“未使用的变量x”。 但是它没有赋值，这样它自己赋值给自己，这样不会有问题吗？[/quote]  这就是赋值了

user: user-0
content: 引用 1 楼 user-8 的回复:避免一些编译器的警告。 对于未使用的变量，很多编译器都会警告“未使用的变量x”。 但是它没有赋值，这样它自己赋值给自己，这样不会有问题吗？

user: user-7
content: 百度一下，你就知道。 http://www.baidu.com

user: user-7
content: 避免一些编译器的警告。 对于未使用的变量，很多编译器都会警告“未使用的变量x”。

user: user-8
content: 避免一些编译器的警告。 对于未使用的变量，很多编译器都会警告“未使用的变量x”。
user-0 提问: 负数如何转换为N进制？

回复:
user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:先按位取反，再末位加一。 这个貌似不是对所有进制有效，自己琢磨了一天，写了两个方法，实现了itoa和atoi进制转换的功能 不知道有没有BUG，赵老师帮忙测试一下   #include <stdio.h> #include <string.h>  char   *iton(int value, char *string, int radix, const char *range); int     ntoi(const char *string, int radix, const char *range);  int main(void) { 	char string[100]; 	 	printf("%s\n", iton(-123, string, 10, ""));	 	printf("%d\n", ntoi("-123", 10, ""));	 	printf("%s\n", iton(-1, string, 2, ""));	 	printf("%d\n", ntoi("11111111111111111111111111111111", 2, ""));	 	printf("%s\n", iton(-8, string, 7, ""));	 	printf("%d\n", ntoi("211301422343", 7, ""));		 	return 0; /**************************************** 输出结果： -123 -123 11111111111111111111111111111111 -1 211301422343 -8 *****************************************/	 }   /* 十进制整数转N进制 */  char *iton(int value, char *string, int radix, const char *range) { 	int    		   i = 0, m, flag; 	unsigned int   uValue; 	char   		   tmp; 	 	if (strlen(range) == 0) range = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 	if (radix > strlen(range)) exit(1); 	/* 10进制负数特殊处理，其它情况将value的值转换为unsigned */ 	/* 转换为无符号数后利用辗转相除法，取余倒序得到相应的结果 */ 	flag = (radix == 10 && value < 0) ? 1 : 0; 	uValue = (radix == 10 && value < 0) ? (unsigned int) -value : (unsigned int) value; 	 	while (uValue > 0) { 		string[i++] = range[uValue % radix]; 		uValue = (radix == 1) ? --uValue : uValue / radix; 	} 	if (flag) string[i++] = '-'; 	string[i] = '\0';  	m = strlen(string) - 1; 	for (i = 0; i < m - i; i++) { 		tmp = string[i]; 		string[i] = string[m - i]; 		string[m - i] = tmp; 	} 	return string; }  /* N进制整数转十进制 */ int ntoi(const char *string, int radix, const char *range) { 	int   		   m = 0, i, j, flag, k, p; 	unsigned int   n = 0; 	 	if (strlen(range) == 0) range = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 	if (radix > strlen(range)) exit(1); 	flag = (radix == 10 && string[0] == '-') ? 1 : 0; 	while (string[m] != '\0') 		m++;  	/* 按位展开，结果相加，保存在一个无符号数中 */ 	/* 将最终的结果转换为有符号整数 */	 	for (i = flag; i < m; i++) { 		for (j = 0; j < strlen(range); j++)  			if (string[i] == range[j]) 				break;	 		for (k = 0, p = 1; k < m - 1 - i; k++)  			p *= radix; 		n += j * p; 	} 	return flag ? -1 * (int) n : (int) n; }

user: user-1
content: 先按位取反，再末位加一。

user: user-0
content: char string[100]; printf("%s\n", itoa(-123, string, 7)); 用itoa方法，输出211301422120  不清楚是如何实现的，大神指点！

user: user-2
content: 好问题  但是7进制 9进制 你用几个bit表示一位7进制数？3个？
user-0 提问: 关于指针常量和常量指针发现编译的一个问题，实在无法解释。求大神指教。。

回复:
user: user-0
content: 对了最后那个程序少了，一行，应该是这样。虽然不写也没什么。只是为了证明第二种情况的发生和它取了变量的地址无关，做个对照。 #include<stdio.h> void main() {char a[5]; char *p; p=a; p="abcd"; *p='t'; printf("%c",*p); }

user: user-1
content: #include <stdio.h> void main() { 	char  *p="abcde"; 	*p='t';	//Turbo C 下就能正常运行并且修改成功,得看编译器的实现 	printf("%c",*p); }  下面是除了Turbo C那种OK的情况  #include <stdio.h> void main() { 	char a[5]="abcd"; //"abcd"的内存分配在栈区,可修改 	char  *p; 	p=a; 	*p='t'; 	printf("%c",*p); }   #include<stdio.h> void main() { 	char a[5]; 	char  *p; 	p="abcd";//"abcd"的内存分配在常量区,不可修改 	*p='t'; 	printf("%c",*p); }  上面的你都理解了const的问题也就明白了

user: user-2
content: 引用 6 楼 max_min_ 的回复:楼主，好好体会下！  char  *p="abcde";// 这句的意思：把"abcde"这个字符串常量地址的值赋值给char *p                 //也就是p指向了"abcde"这块内存地址，而“abcde”是存放在静态区，      //不可修改，只可读，所以当你通过地址试图修改它的内容的时候，内存报错，只是可读    char p[] = "abcde"; //这句的意思：把"abcde"这的字符串的值赋初始化给 p[]这个栈区间上                     //而且这个只是在初始化时才能作的操作，其实的时候                     //则用strcpy,memcpy!  和上面的意思完全不一样！  +1

user: user-3
content: 你必须明白“左值”和“右值”明白了就解决了。  如；n=n+1；  （n+1）这个是右值。右值是不允许修改，如果可以修改计算是不可能的。 想想，n+1,n/1,n*1,n-1;,n是多少呢，n是不变的，如果可以改变，计算是不确定的和无效的。  （n=）这个是左值。他必须是可修改的，如果不可修改计算将不可执行。  *p 在解引用时，你可以得到三个值中的一个，左值，右值和对象值（也就是地址。如果，他是一个指向指针的指针）。  char a[5]; char *p; p=a; *p //这时，你得到的是左值，即可修改的对象。  p="abcd"; *p;//这时解引用得到的是右值，即不可修改的值。  不知道，你理解了没有。

user: user-4
content: 楼主，好好体会下！  char  *p="abcde";// 这句的意思：把"abcde"这个字符串常量地址的值赋值给char *p                 //也就是p指向了"abcde"这块内存地址，而“abcde”是存放在静态区，      //不可修改，只可读，所以当你通过地址试图修改它的内容的时候，内存报错，只是可读    char p[] = "abcde"; //这句的意思：把"abcde"这的字符串的值赋初始化给 p[]这个栈区间上                     //而且这个只是在初始化时才能作的操作，其实的时候                     //则用strcpy,memcpy!  和上面的意思完全不一样！

user: user-5
content: 第一种char *p和const char *p是一样的，但char *p="abcde";是分配在文字常量区的不能被修改。保持等价跟C语言的历史有关，C++建议用const char *p="abcde";而不是用char *p="abcde";可以避免看错而范不必要的错误。  第二种char a[5]="abcd"，这个是数组，分配在栈上。然后char *p=a，使指针指向这个数组的地址。这个和第一种是完全不同的。

user: user-6
content: char  *p="abcde";将指针p指向数据区的"abcde" 从语法上，p是可以修改其指向的内存的（语言标准怎么规定这种情况的我不记得了） 从实现上，"abcde"不能修改，不管你是通过指针p还是别的什么方式 在编译选项里可以设置"abcde"可修改，这样就可以通过p修改数据区的数据了，但不推荐这种行为 推荐的方式还是const char * p = "abcde";

user: user-0
content: 已经结贴了。。。。重开了一帖，是别的问题，关于结构体成员能不能做形参。。

user: user-4
content: 引用 10 楼 u010412073 的回复:谢谢大家，已经明白了。学些了好多东西。 左上角，左下角有结贴按钮！按时结贴是个好习惯哦！

user: user-0
content: 谢谢大家，已经明白了。学些了好多东西。

user: user-0
content: 那个是不是默认char *p 是const？  还是说默认的是auto？需要特殊情况指定const？  可不可以这样理解，当p赋给一个字符串常量，则无法修改它的值，如果赋的是一个定义好的数组名，那么它可以修改这个数组的内容？    小白，表示不太熟悉。

user: user-7
content: #include<stdio.h> void main() {char a[5]="abcd";//a数据存在栈中(Main)连续5个字节,不是在数据区，其和p的地位相同，可以随意修改 char  *p; p=a; *p='t'; printf("%c",*p); }   #include<stdio.h> void main() {char a[5]; char *p; p=a; p="abcd";//p指向a后，又马上转到程序数据区（"abcd";和a没有关系，是一个字符串指针，数据在程序数据区） *p='t'; printf("%c",*p); }
user-0 提问: linux里怎么查看宏定义

回复:
user: user-1
content: 有个简单方法，楼主试试是否奏效： 1、找到使用这个宏的某个文件； 2、找到这个文件使用的头文件； 3、逐个过滤头文件，查找包含关系； 4、定位到最终宏定义；

user: user-2
content: 写个文件，编译一下， gcc -E -dD ，然后你能看到所有的宏定义。  （-E -dD 的含义请参考 man gcc ）

user: user-3
content: 群主，解决了吗？我也想知道这个问题怎么破

user: user-4
content: eclipse 还可以直接看宏展开的结果“ctrl+=”

user: user-4
content: eclipse，F3

user: user-5
content: VS是IDE啊，你那个右键是IDE的功能，跟linux有什么关系  你要查看定义看你用什么工具咯，eclipse、codeblocks、vim？不同的工具，不同的插件咯。  vim下记得是ctag，man是帮助文档，查的是系统里提供的定义和你的要求应该无关。 eclipse、codeblocks应该有内置这类插件的吧，我不太清楚你自己去用用看。

user: user-6
content: 引用 8 楼 u011779875 的回复:[quote=引用 7 楼 max_min_ 的回复:] [quote=引用 5 楼 liyoubaidu 的回复:] [quote=引用 2 楼 u011779875 的回复:] 这个 得需要安装一个辅助工具   在vi中用 那个工具叫什么来着 我用过 但是忘记名字了 可以实现多文件函数跳转的 对叫 Ctag 你试试 能实现我说的查看宏定义的功能？[/quote]  man 2 open  里面有参数详细的说明！没有想vs那么直接而已！ 可以 /O_RDWR 搜索到具体看看！[/quote]版主 每天都在 不用工作 也不玩游戏 看来是个踏实的人啊[/quote]  现在在上班啊！闲的时候过来看下，游戏啊，过了玩的年纪了

user: user-7
content: 引用 7 楼 max_min_ 的回复:[quote=引用 5 楼 liyoubaidu 的回复:] [quote=引用 2 楼 u011779875 的回复:] 这个 得需要安装一个辅助工具   在vi中用 那个工具叫什么来着 我用过 但是忘记名字了 可以实现多文件函数跳转的 对叫 Ctag 你试试 能实现我说的查看宏定义的功能？[/quote]  man 2 open  里面有参数详细的说明！没有想vs那么直接而已！ 可以 /O_RDWR 搜索到具体看看！[/quote]版主 每天都在 不用工作 也不玩游戏 看来是个踏实的人啊

user: user-6
content: 引用 5 楼 liyoubaidu 的回复:[quote=引用 2 楼 u011779875 的回复:] 这个 得需要安装一个辅助工具   在vi中用 那个工具叫什么来着 我用过 但是忘记名字了 可以实现多文件函数跳转的 对叫 Ctag 你试试 能实现我说的查看宏定义的功能？[/quote]  man 2 open  里面有参数详细的说明！没有想vs那么直接而已！ 可以 /O_RDWR 搜索到具体看看！

user: user-7
content: O_RDWR 先看看 你是哪个函数调用的返回值啊 这个可能是create函数吧 man 2 create 我很久不写了  首先光标要移动到你要查看的东西上 然后shift和k一块按动

user: user-0
content: 引用 2 楼 u011779875 的回复:这个 得需要安装一个辅助工具   在vi中用 那个工具叫什么来着 我用过 但是忘记名字了 可以实现多文件函数跳转的 对叫 Ctag 你试试 能实现我说的查看宏定义的功能？

user: user-7
content: 引用 3 楼 liyoubaidu 的回复:[quote=引用 1 楼 u011779875 的回复:] O_RDWR man 2 open man 3 fopen 查看先关函数英文文档 有相应的返回值说明 ？？？ 还是没有看到O_RDWR是怎么define的[/quote] shift + K

user: user-0
content: 引用 1 楼 u011779875 的回复:O_RDWR man 2 open man 3 fopen 查看先关函数英文文档 有相应的返回值说明 ？？？ 还是没有看到O_RDWR是怎么define的

user: user-7
content: 这个 得需要安装一个辅助工具   在vi中用 那个工具叫什么来着 我用过 但是忘记名字了 可以实现多文件函数跳转的 对叫 Ctag 你试试

user: user-7
content: O_RDWR man 2 open man 3 fopen 查看先关函数英文文档 有相应的返回值说明

user: user-0
content: 引用 11 楼 lgbxyz 的回复:下个源码包，用SourceInSight建个工程，用时搜一下 具体要怎么做呢？

user: user-8
content: ctags用这很舒服。 ctags -R * 用vim想跳转的话就CTRL + ]

user: user-9
content: 下个源码包，用SourceInSight建个工程，用时搜一下
user-0 提问: gtk新手   哈希表 求助

回复:
user: user-1
content: 引用 2 楼 zaley 的回复:那怎么使用 g_int_hash 的 哈希表 ? 传递key的时候应该传递整形的指针（当然要保证该指针指向有效地址）。  下面的代码参考一下： #include <glib.h>  int main(int arg, char **argv) { 	GHashTable* hash = g_hash_table_new(g_int_hash, g_int_equal); 	gint* key = g_new(gint, 1); 	gint value = 5; 	*key = 1; 	g_hash_table_insert(hash, key, (gpointer)value); 	 	return 0; }  取值value(gint value = 5)的时候再强制转回整形就可以了。

user: user-0
content: 那怎么使用 g_int_hash 的 哈希表 ?

user: user-1
content: 函数taphash_insert()在调用g_hash_table_insert()的时候，将 将guint32转换为gpointer(void *)，如果frame_num为0，g_hash_table_insert()是要读取gpointer的位置的，那么此时会读取地址0位置，程序理所当然的崩溃（虚拟地址0位置不是程序可以访问的位置）。

user: user-0
content: 那么怎么 lookup 呢？