Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 编写出一个从字符串到长整形的转换函数？

回复:
user: user-1
content: str[i] - '0';  就是把字符的'0' - '9' 变成数字的0-9.  转换原理, 那就是ASCII码.

user: user-2
content: 引用 2 楼 max_min_ 的回复:n = n*10 + str[i] - '0';//???什么意思  后面的减法操作是ascii码的大小操作， 前面的 *10操作是十进制进位操作 同意！！！

user: user-3
content: n = n*10 + str[i] - '0';//???什么意思  后面的减法操作是ascii码的大小操作， 前面的 *10操作是十进制进位操作

user: user-0
content: 引用 1 楼 xiayuanzhong 的回复:不用这么麻烦。 #include <stdio.h>  int main( ) {     long result; 	char source[ 20 ]; 	 	scanf( "%s", source ); 	sscanf( source, "%ld", &result ); 	printf( "%ld\n", result ); 	 	return 0; } 这个还真没想到

user: user-4
content: 不用这么麻烦。 #include <stdio.h>  int main( ) {     long result; 	char source[ 20 ]; 	 	scanf( "%s", source ); 	sscanf( source, "%ld", &result ); 	printf( "%ld\n", result ); 	 	return 0; }
user-0 提问: 内存被释放了为何也可以使用？

回复:
user: user-1
content: 引用 7 楼 baichi4141 的回复:[quote=引用 5 楼 aaadddzxc 的回复:] 我只是觉得奇怪 为何内存被释放了 还可以拷贝东西过去，拷贝的东西放在哪儿？哪儿可以让他放东西了？？按照道理来说 strcpy应该崩溃才对塞 。。。 你可以在任何时候访问任何内存，只要你有内存条 你拷贝的东西在哪？当然在内存条里啊 除非你申请了，否则你的访问是非法的，后果自负 当然，操作系统和杀毒软件会阻止一些访问，但那是它们阻止了你，而不是你无法访问[/quote] 恩！!

user: user-2
content: 你用一个指针（a）指向了一段内存，这个内存使用完了之后，就释放了。（释放了的意思是，这段内存又交给操作系统来管理了，别的地方申请内存的时候可以申请这篇内存了。如果申请了叫做b）但是这个指针的值你并没有改变，他依然指向以前申请的内存。 所以 就会有这样潜在的危险，以前的指针a和b都指向同一片内存，他们都更该内存数据的话， 那么这片内存的数据就混乱了。离崩溃也就不远了。

user: user-3
content: 引用 5 楼 aaadddzxc 的回复:我只是觉得奇怪 为何内存被释放了 还可以拷贝东西过去，拷贝的东西放在哪儿？哪儿可以让他放东西了？？按照道理来说 strcpy应该崩溃才对塞 。。。 你可以在任何时候访问任何内存，只要你有内存条 你拷贝的东西在哪？当然在内存条里啊 除非你申请了，否则你的访问是非法的，后果自负 当然，操作系统和杀毒软件会阻止一些访问，但那是它们阻止了你，而不是你无法访问

user: user-4
content: free只是作了一个释放的标记而已，其中的内容并不会被擦除。  引用 5 楼 aaadddzxc 的回复:我只是觉得奇怪 为何内存被释放了 还可以拷贝东西过去，拷贝的东西放在哪儿？哪儿可以让他放东西了？？按照道理来说 strcpy应该崩溃才对塞 。。。

user: user-0
content: 我只是觉得奇怪 为何内存被释放了 还可以拷贝东西过去，拷贝的东西放在哪儿？哪儿可以让他放东西了？？按照道理来说 strcpy应该崩溃才对塞 。。。

user: user-4
content: free之后意味着这块内存随时可能被其它代码段使用，由于你的代码太简单，仅仅是还未发生危险而已。  引用 楼主 aaadddzxc 的回复:  #include <stdio.h> #include <stdlib.h> #include <string.h>  void Test(void) {     char *str = (char *) malloc(100);     strcpy(str,"hello");     free(str);     if(str != NULL)     {         strcpy(str,"world");         printf("%s\n",str);     } }  int main() {     Test();      return 0; }      为何？

user: user-5
content: C语言规定不能使用没有指向有效对象的指针 你使用了 然后 程序能运行 看起来好像没出错 然后你问 为什么可以使用释放了的内存  这样帮你类比一下   交通法规定不能闯红灯 你开车闯红灯之后 没被交警察觉没被罚款 然后你问 为什么开车可以闯红灯   你可以体会一下

user: user-6
content: 错误代码就是错误代码，还得非给错误代码正名么？

user: user-5
content: 你开车闯红灯 没被撞死  然后你问 我为什么还没死?

user: user-7
content: 其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-8
content: 当内存free后，只是做了一个标记，但是你的指针依然指向它的地址，依然可以使用！做那个标记的作用是意味着该内存已经释放，可以被其它进程分配，也就是其它地方申请空间时，也可能申请到该内存空间。
user-0 提问: C小程序问题 

回复:
user: user-1
content: 试试11楼代码能不能输入汉字。

user: user-0
content: 好吧这个字符的问题还是没能够解决。那么就此结束把！

user: user-0
content: //City->cityname(这个写快了) 应该是：City[i].cityname

user: user-0
content: #include <iostream> using namespace std;  struct citys{ 	int number; 	char *cityname; }City[3]={ 	{1, "fuzhou"},  	{2, "ÏÃÃÅ"},   	{4, "ÆÎÌï"}, 	};  int f(char *city) { 	int i; 	int numcity; 	for(i = 0; i < 3; i++) 	{ 		if(strcmp(City->cityname, city) == 0) 		{ 			numcity = City[i].number; 			break; 		} 	} 	return numcity; }  int main() { 	int number; 	char city[6]; 	scanf("%s", city); 	number = f(city); 	printf("%s number is 059%d", city, number); }//修改了下，现在的问题是“无法输入汉字”这是什么原因呢。

user: user-2
content: 除了楼上说的字符串比较问题之外，main里定义的char *city指向随机，直接cin >> city可能会有问题吧？至少如果在我的C-FREE5.0上编译运行会被计算机阻止的。 建议将 char *city; cin >> city; 改成 char city[4]; scanf("%s",city);

user: user-0
content: = =忘记了是字符串不能用==比较了，太久没写了。我知道用string可以，只是想用char来写写看。

user: user-3
content: 再一个，char*表示的字符串，不能用"="来比较是否是相等，要用字符串比较函数。

user: user-3
content: 直接用string不是挺好么，为什么非要用char*

user: user-0
content: 纠正一下上面的乱码： {1, "fuzhou"},   {2, "ÏÃÃÅ"},    {4, "ÆÎÌï"},   {1, "福州"},   {2, "厦门"},    {4, "莆田"},

user: user-0
content: 引用 10 楼 richyhuang 的回复:不能输入汉字是因为你工程设置没有使用unicode吧 如何设置？

user: user-1
content: 仅供参考#pragma warning(disable:4786) #include <iostream> #include <string> #include <map> using namespace std; int main () {     wstring ws1,ws2;      wcin.imbue(locale("chs"));     wcout.imbue(locale("chs"));     getline(wcin,ws1);     getline(wcin,ws2);     if (ws1.size()!=ws2.size()) {         wcout<<ws1<<L" 和 "<<ws2<<L" 不对应"<<endl;         return 1;     }      map<wchar_t,wchar_t> m1,m2;     int n=ws1.size();      for (int i=0;i<n;i++) {         if (m1.find(ws1[i])==m1.end() && m2.find(ws2[i])==m2.end()) {             m1[ws1[i]]=ws2[i];             m2[ws2[i]]=ws1[i];         } else {             if (m1[ws1[i]]!=ws2[i] || m2[ws2[i]]!=ws1[i]) {                 wcout<<ws1<<L" 和 "<<ws2<<L" 不对应"<<endl;                 return 1;             }         }     }     wcout<<ws1<<L" 和 "<<ws2<<L" 对应"<<endl;     return 0; }

user: user-4
content: 不能输入汉字是因为你工程设置没有使用unicode吧

user: user-0
content: 运行后无法输入汉字，只能处理英文。

user: user-5
content: 好像没有问题，楼主运行是什么效果？
user-0 提问: 求教，怎么用C实现对一个网站的访问，要填写那个网站上的一张表并提交，似乎跟什么HTTP-TINY有关

回复:
user: user-0
content: 引用 1 楼 user-3 的回复:http://freecode.com/projects/http-tiny 感谢user-3 对回答，网站有些简介，但是上面的库下载不了。。英文不大行，找不到例子，能再帮忙看看不

user: user-1
content: 经典实用！  引用 1 楼 user-3 的回复:http://freecode.com/projects/http-tiny

user: user-2
content: 引用 1 楼 user-3 的回复:http://freecode.com/projects/http-tiny

user: user-3
content: http://freecode.com/projects/http-tiny
user-0 提问: WriteConsoleOutputCharacter的问题

回复:
user: user-0
content: 引用 1 楼 xiayuanzhong 的回复:最后一个DWORD要指明。 以下代码测试通过。  #include <windows.h> #include <stdio.h> #include <conio.h> #include <string.h>  int main( void ) {     COORD pos = { 10, 10 }; 	LPCSTR str = "hello,world";     DWORD buf = 0; 	     HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE );     WriteConsoleOutputCharacterA( hOut, str, strlen( str ), pos, &buf ); 	     getch( ); 	return 0; }   我用 LPDWORD buf=new  DWORD;  也过了。

user: user-1
content: 最后一个DWORD要指明。 以下代码测试通过。  #include <windows.h> #include <stdio.h> #include <conio.h> #include <string.h>  int main( void ) {     COORD pos = { 10, 10 }; 	LPCSTR str = "hello,world";     DWORD buf = 0; 	     HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE );     WriteConsoleOutputCharacterA( hOut, str, strlen( str ), pos, &buf ); 	     getch( ); 	return 0; }
user-0 提问: 谭浩强《c语言程序设计》P82页第一题第一问的答案（在《学习辅导》上）是不是给出的结果是错的

回复:
user: user-0
content: 谢谢楼上3个老兄

user: user-1
content: 引用 楼主 zhy934453950 的回复:传图太慢。。。。5张高清图。。。累死了。。。直接给百度知道的问题链接：http://zhidao.baidu.com/question/552031159438999972.html?quesup2&oldq=1 知道逻辑过程就行了，计算机一涉及到浮点数问题就大了，你们搞惯了的vc或者x86、x64体系可以完美的得出你想要的结果，换了平台还得真心掂量掂量  个人原则，非x86、x64平台 一切涉及浮点的运算用位移来计算，用多个整数类型来存放不同位置的值

user: user-2
content: 引用 1 楼 user-3 的回复:1000元一次性存5年，如果利息为5.85%,那么到期后总共钱为1000+1000*0.0585*5,所以他前面 的描述是对的，但是后面那个式子应该是笔误了。  这个在银行存过钱的都知道。你应该是对的。 上面说的有理。 另外需要说的是，lz的代码上面定义的 p1 和 r 都是double，但最后输出时却是 %f ，当然，这是可以运行的，但这样不好，应该为 %lf， 不然会有警告，而在写一些很长的代码时，就有可能造成错误，所以需要注意

user: user-3
content: 1000元一次性存5年，如果利息为5.85%,那么到期后总共钱为1000+1000*0.0585*5,所以他前面 的描述是对的，但是后面那个式子应该是笔误了。  这个在银行存过钱的都知道。你应该是对的。
user-0 提问: ********求指点，Unix记录锁使用问题*********

回复:
user: user-0
content: 引用 1 楼 Idle_Cloud 的回复:这个的用法你要注意了。flock文件锁是进程锁，进程内拿到锁了，可以继续随便锁，进程退出就没锁了，所以你查看自己的锁是查看不到了，但是你起另外一个进程去查看就可以查看到锁。 原来如此。

user: user-1
content: 这个的用法你要注意了。flock文件锁是进程锁，进程内拿到锁了，可以继续随便锁，进程退出就没锁了，所以你查看自己的锁是查看不到了，但是你起另外一个进程去查看就可以查看到锁。
user-0 提问: 函数小问题

回复:
user: user-1
content: http://www.cs.utah.edu/~germain/PPS/Topics/C_Language/c_functions.html

user: user-2
content: 引用 3 楼 cai5301 的回复:这只是声明对吧，具体的定义还是要写清标识符int max(int a, int b){...}? 是的

user: user-0
content: 这只是声明对吧，具体的定义还是要写清标识符int max(int a, int b){...}?

user: user-3
content: 你那句话是一个函数原型，表示一个传入2个整形数据，在函数内部进行某些操作，然后传回一个整型数据，即函数值为返回的值，调用参照楼上即可

user: user-4
content: int a = 20; int b = 10; int c;  c = max(a, b);   引用 楼主 cai5301 的回复:int max(int , int ); 这样子形式的函数要怎么调用？？
user-0 提问: c求助  如何能在一组单词中挑选出到含有某个字母的单词？

回复:
user: user-1
content: 算法查找。。。 实现很简单，效率问题

user: user-2
content: 1.图个方便的话用string的操作函数 2.自己动手写算法实现

user: user-3
content: /*在一组单词中挑选出到含有某个字母的单 词并且按照单词含有该字母的数量排序*/ #include<stdio.h> #include<string.h> #include<ctype.h> #define MAX 20  int main(void) { 	void copym2n(char *, char *, int, int); 	int countch(char *, char);  	char s[MAX] = {0}, ch = 0; 	char p[MAX][MAX] = {0}; 	char tem[MAX]; 	int i, j, k, l, b, e, flag = 0, count = 0;  	printf("Please input a string:"); 	gets(s); 	printf("Please input a word:"); 	scanf("%c", &ch);  	l = strlen(s);  	for(i=k=b=e=0;i<=l;i++)//将字符串中的单词存放到二维数组中 	{ 		if(i && !isalpha(s[i])) 		{ 			e = i - 1; 			flag = 1; 			copym2n(p[k++], s, b, e); 		} 		if(flag) 		{ 			b = i==0 ? 0 : i + 1; 			flag = 0; 		} 	} 	for(i=j=0;i<k;i++)//剔除不含ch的字符串 		if(countch(p[i], ch)!=0) 			strcpy(p[j++], p[i]); 	 	k = j; 	 	for(i=0;i<k;i++)//比较法排序 		for(j=i+1;j<k;j++) 			if(countch(p[i], ch)<countch(p[j], ch)) 			{ 				strcpy(tem, p[i]); 				strcpy(p[i], p[j]); 				strcpy(p[j], tem); 			} 	for(i=0;i<k;i++) 		printf("%s\n", p[i]); }  //把字符串2中s[m]到s[n]的元素复制到字符串1中 void copym2n(char *p1, char *p2, int m, int n) { 	int i; 	for(p2 +=m,i=0;i<=n-m;i++) 		*(p1 + i) = *p2++; 	*(p1 + i) = 0; }  int countch(char *s, char ch)//返回s数组中含有ch的数量 { 	int i, count = 0; 	for(i=0;i<(int)strlen(s);i++) 		if(*(s+i)==ch) 			count++; 	return count; } 随便写的，只供参考，还不知道有没有bug，如有问题，烦请更正（^_^）

user: user-4
content: linux直接用awk

user: user-5
content: 查找strchr() & 比较strcmp() & 排序qsort()

user: user-6
user-0 提问: 问下各位，这个程序是按什么顺行执行的，我一直没弄懂。不按ctrl+c什么也打印不出来，按下ctrl+c能打印出Faild to restore SIGINT　3

回复:
user: user-1
content: 在prinf后面加个 fflush(stdout);

user: user-0
content: 我发现问题所在了，比如下面列出的代码#include<stdio.h> int main(){ printf("aaaaaaaaaaaaaaaaaaaaaa\n"); printf("vvvvvvvvvvvvvvvvvvv\n"); while(1); printf("1111111111111111111"); return 0; } 在VC上可以输出aaaaaaaaaaaaaaaaaaaaaa  vvvvvvvvvvvvvvvvvvv 然后进入死循环，但是在ubuntu命令行中什么也输出不了就进入死循环了，具体为什么我也不知道

user: user-0
content: 程序运行后为什么main下面一行printf("000000000000000000000");都没打印出来，难道和我用的系统有关系？

user: user-2
content: man 2 sigaction

user: user-3
content: 从main()函数那里开始的，一步一步的走，面向过程

user: user-4
content: 按什么顺序？ 直接debug不就看到了  一步一步的
user-0 提问: 递归遍历目录中的文件（包括子文件夹里的文件）的一个问题

回复:
user: user-1
content: //增加一个参数， 可以用CStringList吗？  void dirSearch( const char * file_name，CStringList &NameList ) {    _findfirst( &handle, &file_info );    if( -1 == handle )    {        printf( "....\n" );        return 0;    }           else     {        if( strcmp( file_info.name,  "." ) && strcmp( file_info.name, ".." ) )        {            ...            dirSearch( ... )         }          // 这里就是找到了完整图片的路径，但是由于是递归遍历，所以我没想到办法        // 怎么把这些图片的路径在接口外部传出来,只能在这个接口里进行操作，        // 比如加载显示图片        // 我现在想做的就是如何能在接口外面操作文件夹里的每一张图片        else        {            NameList->AddTail(file_info.name);                 }      } }

user: user-2
content: 用容器，妥妥滴，最灵活。除此之外，你可以传入一个function指针，或者一个functor，这个或许看起来貌似比较高端大气上档次~

user: user-3
content: 有一个vector把结果保存起来，做为参数传出来

user: user-4
content: 引用 4 楼 a130098300 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。 忘了说了，是基于Windows的...[/quote] 我说的就是windows，如果是linux，就得用ls命令而不是dir命令了。

user: user-5
content: 我看楼主可以把它放到一个容器里面去吧, 就可以等这个函数结束了以后再处理

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

user: user-4
content: system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。 忘了说了，是基于Windows的...
user-0 提问: Socket读取消息，一般有哪些方法可以判定读取了一个完整的消息？

回复:
user: user-1
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html

user: user-2
content: LZ你说的这个问题，叫做“数据链路层帧格式” 通常的方法可以分成4类: 1. 字符计数法 2. 含字节填充的分界符法 3. 含位填充的分界标志法 4. 物理层编码违例法  具体的信息你可以google一下

user: user-3
content: 要么固定包长, 要么加标记? 常用的也就这些方法了.

user: user-4
content: 你这个貌似没得偷懒，用2或者3的方法。个人感觉3更好，我们都是用3的方法。

user: user-5
content: 我知道的就是2和3，不限socket，以消息为单位的通信都是 2通常应该是一段特定格式的数据，某个位置是后面有效数据的长度 3通常应该是消息的开头和结尾都是特定的数据

user: user-6
content: 最好头里带长度，不然你就得百般小心消息内容里会不会有终结符。然后，可以吧消息的checksumm和消息一起发过去，接收端验证checksum。当然，这要消耗资源。

user: user-7
content: 包头 + 消息(包头中带有消息长度)
user-0 提问: struct指针类型的问题

回复:
user: user-0
content: 引用 2 楼 steedhorse 的回复:你的struct本身是匿名的，它只有一个typedef出来的名字叫LinkNode。 既然LinkNode已经是一个类型名，为什么定义成员变量的时候还使用“struct”？  多谢，懂了。

user: user-0
content: 引用 1 楼 u012210441 的回复:因为你用tyepedef定义了一个新类型，后面用到它是不用struct的  多谢，懂了。

user: user-0
content: thank all， 因为我使用的是，typedef  struct名称，所以会出现警告。多谢多谢各位。

user: user-1
content: typedef struct _LinkNode {     DataType data;     struct _LinkNode* next;   }LinkNode;  一般是这样写的，注意与你的区别。

user: user-2
content: struct LinkNode {     DataType data;     struct LinkNode* next;   };

user: user-0
content: 引用 1 楼 u012210441 的回复:因为你用tyepedef定义了一个新类型，后面用到它是不用struct的  嗯，也没有用到，只是在next赋值的时候出现的警告，我把代码贴全了一些。 帮我看看，完全不知道怎么避免这个警告。

user: user-0
content: 引用 2 楼 steedhorse 的回复:你的struct本身是匿名的，它只有一个typedef出来的名字叫LinkNode。 既然LinkNode已经是一个类型名，为什么定义成员变量的时候还使用“struct”？  我再贴的全一些。   ... LinkNode* tempNode = charsList;  	while(tempNode->data != '\n') 	{ 		tempNode->next = (LinkNode*) malloc (sizeof(LinkNode)); 		tempNode = tempNode->next;  		int tempData = getchar(); 		tempNode->data = tempData; 	}  	tempNode->next = NULL;   正如你所说的，我并没有在使用过程中用 struct ListNode* 来进行变量声明，但由于结构体中的 变量声明为struct ListNode*, 所以next指针赋值时会出现警告。

user: user-3
content: 你的struct本身是匿名的，它只有一个typedef出来的名字叫LinkNode。 既然LinkNode已经是一个类型名，为什么定义成员变量的时候还使用“struct”？

user: user-4
content: 因为你用tyepedef定义了一个新类型，后面用到它是不用struct的
user-0 提问: 正则表达式问题

回复:
user: user-1
content: http://www.baidu.com/s?wd=%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F+%E8%B6%85%E9%93%BE%E6%8E%A5&rsv_bp=0&ch=&tn=baidu&bar=&rsv_spt=3&ie=utf-8&rsv_sug3=3&rsv_sug4=16&rsv_sug1=2&rsv_sug2=0&inputT=0

user: user-2
content: 参考这个 http://blog.sbw.so/Article/index/title/C++%20%E4%BD%BF%E7%94%A8%20Boost%20%E5%BA%93%E8%BF%9B%E8%A1%8C%E6%AD%A3%E5%88%99%E5%8C%B9%E9%85%8D.html
user-0 提问: 简单的结构体程序运行出错 求助！

回复:
user: user-1
content: 你的代码只是相当于int a;然后就输出a的值，肯定是不行啊

user: user-2
content: struct s1 {     char a;     int b[2];     double c; }*p; 只是定义了数据类型，没有定义内存变量，p不是变量，是类型

user: user-3
content: 月经贴    .

user: user-0
content: 哇，一觉醒来有这么多好心人啊，我要仔细看看，谢谢大伙！！！

user: user-4
content: #include <stdio.h> #include <stdlib.h>  struct s1 {     char a;     int b[2];     double c; } s,*p;  int main() {     p=&s;     p->a = 'c';     printf("%c", p->a);     return 0; }

user: user-5
content: p 没有初始化，用p=(s1*)malloc(sizeof(s1)); ps:老用c++，写法上可能有错误

user: user-6
content: #include <stdio.h> #include <stdlib.h>  struct s1 {     char a;     int b[2];     double c; }*p;  int main() {     p=(struct s1*)malloc(sizeof(struct s1));//要分配内存     p->a = 'c';     printf("%c", p->a);     free (p);     return 0; }

user: user-7
content: 没有定义变量，还没有地址呢
user-0 提问: 问一个内存方面的问题

回复:
user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-1
content: 其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-0
content: 引用 10 楼 iamkconghua 的回复:楼上正解。 建议lz看看五大内存的知识。 全局静态区的内存是由系统分配，也是由系统释放的，程序员干预不了。  我懂了，只能放到堆栈里才能做到这效果

user: user-2
content: 引用 楼主 was595 的回复:假如我定义一个全局数组和静态数组，我想在不用malloc函数，对这两个数组做释放内存的功能，然后把这两个数组指针指NULL，这两个数组在内存里还会被我占用吗？ 全局数组和静态数组不需要使用malloc和free来处理，其生命周期就是你的程序的生命周期 我是这么理解的

user: user-3
content: 楼上正解。 建议lz看看五大内存的知识。 全局静态区的内存是由系统分配，也是由系统释放的，程序员干预不了。

user: user-4
content: 全局数组和静态数组是存放在静态存储区的，用free肯定不能释放，只能等程序结束时被系统销毁，其他的函数或原理还没学

user: user-5
content: 引用 2 楼 was595 的回复:[quote=引用 1 楼 baichi4141 的回复:] 你只能free由你malloc的内存  那像我所说的，假如我把已经定义的全局数组和静态数组，两个数组都指向NULL，那这两个数组的原本空间还会被我占用吗？[/quote]  会占用的，只有free.

user: user-6
content: 要分清堆栈。

user: user-7
content: 会占用  程序退出的时候被销毁

user: user-8
content: 引用 3 楼 was595 的回复:[quote=引用 2 楼 was595 的回复:] 那像我所说的，假如我把已经定义的全局数组和静态数组，两个数组都指向NULL，那这两个数组的原本空间还会被我占用吗？ 有一句说错了，是两个数组的首指针都指向NULL[/quote] 把指向数组的指针指向其他地方，对数组一点影响都没有 至于“做释放内存的功能”，我只能说，请不要空想

user: user-9
content: 我想在不用malloc函数，对这两个数组做释放内存的功能  不明白什么意思，只要有malloc，就必须free 如果数组不是malloc的，那free它做什么

user: user-0
content: 引用 1 楼 baichi4141 的回复:你只能free由你malloc的内存 引用 2 楼 was595 的回复:[quote=引用 1 楼 baichi4141 的回复:] 你只能free由你malloc的内存  那像我所说的，假如我把已经定义的全局数组和静态数组，两个数组都指向NULL，那这两个数组的原本空间还会被我占用吗？[/quote]  有一句说错了，是两个数组的首指针都指向NULL

user: user-0
content: 引用 1 楼 baichi4141 的回复:你只能free由你malloc的内存  那像我所说的，假如我把已经定义的全局数组和静态数组，两个数组都指向NULL，那这两个数组的原本空间还会被我占用吗？

user: user-8
content: 你只能free由你malloc的内存
user-0 提问: C语言变量定义的问题

回复:
user: user-0
content: 可能是第二种好，但是我不知道原因啊。第一种说会重复定义，但是我在C语言里试第一种不会报错。求大侠解释原因啊、。。、、。、。

user: user-1
content: 看了楼上各位的解释，我自己也有一些启发

user: user-2
content: 我觉得这个看个人喜欢吧。

user: user-3
content: 引用 11 楼 zengyaowu1988 的回复:楼上我试过了，在头文件中定义的话不会出错，我用C语言写的。 我疑惑的是头文件里面不能赋值，这样的话不知道能不能保证flag的初始值为0.因为我可能不修改这个flag的值，直接调用底层那个接口的。 C语言不知道，C++里用extern在头文件里声明，在cpp里声明加定义，就能保证它的初始化。当然cpp里的定义必须只有一次 比如  //head.h #ifndef __HEAD__H__ #define __HEAD__H__ extern int a; #endif  //source.cpp #include "head.h" int a = 0;  这样在其他任何cpp或h文件中包含head.h，都能保证有那么一个int型变量a，并且被初始化为0. 当然head.h和source.cpp必须被加入工程中。

user: user-4
content: 第二种方法，毫无疑问

user: user-4
content: 引用 7 楼 buyong 的回复:我觉得第一种好。 编译问题，只要在头文件加上 #ifndef *** #define *** #endif

user: user-5
content: 第一种就是错误的 如果头文件多include一次就会造成变量重复定义。

user: user-0
content: 楼上我试过了，在头文件中定义的话不会出错，我用C语言写的。 我疑惑的是头文件里面不能赋值，这样的话不知道能不能保证flag的初始值为0.因为我可能不修改这个flag的值，直接调用底层那个接口的。

user: user-3
content: 引用 9 楼 zengyaowu1988 的回复:我觉得这位大哥说得对啊。 我觉得第一种好。 编译问题，只要在头文件加上 #ifndef *** #define *** #endif 其他人都说会重定义。。。到底哪个比较好啊，求大神，， 加上header guard确实不会有重定义，如果保证C中只声明不定义相当于使用extern这条规则，那第一种和第二种没区别。但若没那条规则，即使不重复声明，也会有问题。因为两个cpp都包含同一个头文件，那么这两个cpp都会有同一个变量的2个声明，这样还是会造成重复声明，具体是直接报错，还是导致程序里出现两个同名变量，这得你自己去试，但是加了extern就能保证整个程序里就一个变量，不会有副本

user: user-0
content: 我觉得这位大哥说得对啊。 我觉得第一种好。 编译问题，只要在头文件加上 #ifndef *** #define *** #endif 其他人都说会重定义。。。到底哪个比较好啊，求大神，，

user: user-6
content: 提倡用第二种方法

user: user-7
content: C++提倡变量定义紧挨在使用之前。

user: user-8
content: 第一种明显会造成重复定义。 最好采用第二种。  也可以这样： 在第一个.c中 定义 int flag = 0； 然后再头文件中 声明 extern int flag； 然后在第二个.c中包含头文件，直接使用flag变量 ...... 然后在第N个.c中包含头文件，使用flag变量

user: user-9
content: 第一种方法会出现重复定义的吧 在编译的时候，是将.c文件中的.h文件内容拷贝到.c文件中。所以，第一种使用方法就会造成两个.c文件中定义了同名的变量，导致重复定义的问题

user: user-10
content: 楼上正解。 最好别用第一种方法，变量定义在头文件中，很容易在一个文件中被包含多次，从而造成变量重定义。

user: user-11
content: 第一种会重定义 在头文件声明为 extern int iflag；  再选择一个.c文件定义变量 int iflag；

user: user-12
content: 我觉得第一种好。 编译问题，只要在头文件加上 #ifndef *** #define *** #endif

user: user-13
content: 这两种方法本质上是等价的，第二种更明确因此更好 在C语言中，如果你定义int变量的时候未赋值，则该定义也可以被看做一个extern声明
user-0 提问: c语言中，两个形式相同的“结构数组”可以直接相互赋值吗？

回复:
user: user-0
content: 引用 9 楼 u013595256 的回复:数组名只是地址，是指针型常量，常量当然不能进行赋值很有道理，谢谢。主要是忽略了结构数组也是数组，数组的性质应该对它同样适用。而是老想着机构体这一块了。

user: user-1
content: 结构体只能初始化一次，整体赋值没意义吧！

user: user-2
content: 数组名只是地址，是指针型常量，常量当然不能进行赋值

user: user-0
content: 引用 7 楼 baichi4141 的回复:数组除定义外不能整体操作 绝大部分使用数组名的情形，实际上使用的都是数组名隐式转化的指向数组首元素的指针，包括最常见的[]操作符 跟结构体不结构体一点关系都没有一语中的！非常感谢！

user: user-3
content: 数组除定义外不能整体操作 绝大部分使用数组名的情形，实际上使用的都是数组名隐式转化的指向数组首元素的指针，包括最常见的[]操作符 跟结构体不结构体一点关系都没有

user: user-0
content: 好的，心里有底了，谢谢

user: user-4
content: 不可以,这是为保持C语言的纯洁性

user: user-0
content: 引用 3 楼 derekrose 的回复:编译器不是标准我用的是vs2010.编译时这句boy2=boy有问题。所以我才想是不是即使两个结构数组变量形式相同，但是还是不能直接相互赋值。

user: user-5
content: 编译器不是标准

user: user-0
content: 引用 1 楼 user-6 的回复:为啥懒到不肯去翻自己的教材？我翻了啊，书上只说结构变量可以直接相互赋值，但是结构数组变量没有明确的说明。所以写了上面的函数编译了一下，不行。但是心里没底，所以才到这里确定一下。

user: user-6
content: 为啥懒到不肯去翻自己的教材？
user-0 提问: 程序思路是不是有问题~~求指点~~

回复:
user: user-1
content: 不客气 还有就是lz注意代码尽量要规范

user: user-1
content: lz你的思路不对吧，每年减去10万后总数减小，下一年的增长就变小了，若按你的思路，岂不是不变？这不对吧！ 代码应该是这样吧： # include <stdio.h>  int main(void) {     double invest = 100.0,draw = 10.0;     int i = 0; 	     while(invest > 0)     {		         invest += invest*0.08; 		invest -=draw;         i++;     }     printf("%d\n", i); 	     return 0; }  最终结果是21年

user: user-2
content: 不用那个draw变量，条件改为invest > 0 draw += 10;改为invest -= 10.0; 结果是21年

user: user-0
content: 引用 4 楼 u012421456 的回复:lz你的思路不对吧，每年减去10万后总数减小，下一年的增长就变小了，若按你的思路，岂不是不变？这不对吧！ 代码应该是这样吧： # include <stdio.h>  int main(void) {     double invest = 100.0,draw = 10.0;     int i = 0; 	     while(invest > 0)     {		         invest += invest*0.08; 		invest -=draw;         i++;     }     printf("%d\n", i); 	     return 0; }  最终结果是21年谢谢~~我这一直蒙圈了~~幸亏有大侠指点啊~~

user: user-3
content: 可能是浮点比较出了问题。应该了解到浮点数的表达是有误差的，比较方法也不同于整型。  invest > draw 可能应该改成： invest >= draw  最后还应该判断: invest与draw的差值，如果大于0应该将i再加1。  个人建议，仅供参考。

user: user-4
content: int deposits = 10000; unsigned int times = 0;  while(deposits > 0) {     deposits *= 108;     deposits -= 1000;     ++times; }
user-0 提问: C语言头文件

回复:
user: user-1
content: 是报错还是给出警告？

user: user-2
content: LISTCS_ToPre( &Cursor ); 这句是强转一下类型试试，LISTCS_ToPre((PLISTCS)&Cursor);

user: user-3
content: 符号引用无法解析，这可能这是一个link error 请帖出整个.c和.h文件。

user: user-0
content: 虽然说我问题的焦点不在这个地方。。。 LISTCS_Pre和LISTCS_ToPre的意义不一样。。。 一个是吧Cursor修改，一个是获取修改后的结果。。。 所以得两个函数。。。 既然这样而且LISTCS_Pre就这么几行，我当然是用inline修饰提速了。。 而且我看的资料说只有在inline函数的代码长度较长，或者包含循环语句，复杂的开关语句等的时候才会被忽略。。。 我这里就一个函数调用。。。应该不会被忽略才对。。。

user: user-4
content: 引用 4 楼 l383137093 的回复:呃?为什么呢？ 没说inline函数中不能调用函数吧。。。 inline 指示对编译器来说只是一个建议，编译器可以选择忽略  inline LISTCS LISTCS_Pre( LISTCS Cursor ) {     LISTCS_ToPre( &Cursor );     return Cursor; } //这样的调用，inline意义不大，直接调用那个LISTCS_ToPre不就可以了

user: user-0
content: 呃?为什么呢？ 没说inline函数中不能调用函数吧。。。

user: user-4
content: 这样调用估计已经不是inline，也没必要用inline了

user: user-0
content: 呃。。。工程里面只有一份.c文件，就只有 #include "list.h" int main() {     return 0; } list.h和list.c都在改工程目录下但为被包含进该工程 然后编译。。 在list.c的这里报错，提示undefined reference to LISTCS_ToPre inline LISTCS LISTCS_Pre( LISTCS Cursor ) {     LISTCS_ToPre( &Cursor );     return Cursor; } 但是在这部分之前已经声明了void LISTCS_ToPre( PLISTCS Cursor );

user: user-5
content: 直接贴代码会更好
user-0 提问: 菜鸟想知道如何正确学习汇编语言与C/C++语言，请指教。

回复:
user: user-1
content: 引用 楼主 JackYau 的回复:主要是想学习C/C++语言，在学校期间只看完谭浩强的C语言程序设计最基础的书，想深入学习C/C++，运用汇编语言能制作出软件Keygen，希望老鸟们能提供学习的方向与书籍，最好能提供一个下载URL，非常感谢。  教学书藉要包括汇编语言与C/C++的教学书藉，非常感谢。  看《see mips run linux》 讨厌一来就x86汇编，对于c语言基础一般和操作系统以及计算机组成原理相关内容都没什么概念的人无疑绝大多数内容是天书，学习汇编不是让你能够写汇编程序，而是让你认识到一种cpu是如何工作的。

user: user-2
content: C语言视频教程  比较基础和系统，可以去看看。

user: user-3
content: 引用 5 楼 JackYau 的回复:那请教一下学好C/C++语言有什么好的书藉可以一步一步深入呢？目前我只看了谭浩强老师的那本C语言程序设计，记得原来还有一本书比我学过的这本更深入一些，但是不知道在哪里有下载。  请各位老师多给些指点吧。。详细述说一下有哪些好的教程，以及如何学习，包括使用哪些编辑器来学习等等。谢谢。我的学习过程是谭浩强那本->c primer plus->c 陷阱与缺陷->c和指针->c专家编程，这是我看的数，真的把c学好最重要的是多练习，多看别人的代码，希望对你有帮助

user: user-4
content: 主要还是自己理解，这个时候自学很重要。我就是自学的特别是最开始的一个月差一点把我逼疯了

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

user: user-0
content: 非常感谢以上老师的耐心解答,简单介绍一下自己吧，CCNA目前做网管与DataCenter管理，早期学习计算机应用，然后转为计算机网络专业，毕业后一直从事网络工作十二年，学无止境，因为工作中经常需要使用很多软件，曾经也购买过一些正版软件，但是无奈钱太少，实在买不起所有自己想要的软件，所以下载了国外的0day组织破解含有keygen的软件，感觉确实非常强大，想向逆向工程师的方向学习一些，能够在平时工作中对一些软件进行破解或者自己构造keygen，不知道难度有多大，请各位老师多多说明，谢谢。  学C是在大学里由教授教的，效果很好，但是没有深入，只学了最基础的那本，说到指针后就没深入进去了，感觉很可惜。汇编语言没系统学过。不知道再深入C语言甚至C++，要如何入手。感谢你们的意见，我会尽力学习。毕竟现在年龄大多了。

user: user-6
content: 引用 5 楼 JackYau 的回复:那请教一下学好C/C++语言有什么好的书藉可以一步一步深入呢？目前我只看了谭浩强老师的那本C语言程序设计，记得原来还有一本书比我学过的这本更深入一些，但是不知道在哪里有下载。  请各位老师多给些指点吧。。详细述说一下有哪些好的教程，以及如何学习，包括使用哪些编辑器来学习等等。谢谢。 一搜一大把，http://bbs.csdn.net/topics/390090123

user: user-0
content: 那请教一下学好C/C++语言有什么好的书藉可以一步一步深入呢？目前我只看了谭浩强老师的那本C语言程序设计，记得原来还有一本书比我学过的这本更深入一些，但是不知道在哪里有下载。  请各位老师多给些指点吧。。详细述说一下有哪些好的教程，以及如何学习，包括使用哪些编辑器来学习等等。谢谢。

user: user-7
content: 王爽汇编和琢石成器,学习汇编的利器

user: user-8
content: 进入百度，搜索中输入：  Win32ASM Tutorial Resource Kit v1.0 site:pan.baidu.com  可得之

user: user-9
content: http://www.pediy.com/document.htm 其中那本"Win32ASM Tutorial Resource Kit v1.0"

user: user-8
content: 进入百度，搜索中输入：  C语言 site:pan.baidu.com
user-0 提问: 能否告知我做的这个通讯录管理系统为什么插入联系人时程序崩溃了？

回复:
user: user-1
content: 插入联系人的时候有没有地址非法使用，越界等可能性呢？

user: user-2
content: 引用 4 楼 sanredfish 的回复:for(i=0;i<countperson;i++) {     if(strcmp(d,m[i].name)==0)/*找符合插入的点*/     {          for(j=countperson-1;j>=i;j++)/*从最后一个联系人开始依次后移一个位置*/          {               memcpy(&(m[j+1]),&(m[j]),sizeof(Maillist));          }     } } 你的循环条件，初始条件是最后一个联系人，循环条件是后一个联系人，限制条件是大于i，肯定溢出。应该是j-- 另外你的循环中没有退出条件，效果就是如果有两个人同名，通信录将被移两次，然后你的拷贝是定点的，导致重复人记录多一，后面的人可能会被覆盖掉。在进行一次移位之后应有退出。 其实为了保证操作目标的唯一性，最好每个号码有一个索引，这样你的程序编写也会容易些。 另外有插入的记录格式，用链表比线性数组更简便快捷，在结构体里增加一个指针就可以，增加删除插入排序都不用做结构拷贝。 楼上正解。一个通讯录里不能出现同名的人。我的建议是利用strcmp写一个比较函数，当有重名的时候调用删除联系人函数。

user: user-3
content: for(i=0;i<countperson;i++) {     if(strcmp(d,m[i].name)==0)/*找符合插入的点*/     {          for(j=countperson-1;j>=i;j++)/*从最后一个联系人开始依次后移一个位置*/          {               memcpy(&(m[j+1]),&(m[j]),sizeof(Maillist));          }     } } 你的循环条件，初始条件是最后一个联系人，循环条件是后一个联系人，限制条件是大于i，肯定溢出。应该是j-- 另外你的循环中没有退出条件，效果就是如果有两个人同名，通信录将被移两次，然后你的拷贝是定点的，导致重复人记录多一，后面的人可能会被覆盖掉。在进行一次移位之后应有退出。 其实为了保证操作目标的唯一性，最好每个号码有一个索引，这样你的程序编写也会容易些。 另外有插入的记录格式，用链表比线性数组更简便快捷，在结构体里增加一个指针就可以，增加删除插入排序都不用做结构拷贝。

user: user-4
content: step by step debug

user: user-5
content: 把Countperson放在函数外定义
user-0 提问: 新人求助 为什么这个求方程解的程序不好用呢？

回复:
user: user-1
content: 不客气，你可以试试啊！看有没有空格有啥区别，说实话，我也不清楚，只知道在这里如果不加空格会出问题 这一点我是看郝斌老师的C语言视频时他专门点出来的，至于为啥他说以后会讲到，不好意思啊！要不再看看别人知道不知道

user: user-0
content: 引用 2 楼 u012421456 的回复:感觉lz的代码不太好，这是一种写法： # include <stdio.h> # include <math.h>  int main(void) { 	double a, b, c;	 	double delta; 	double x1, x2;	 	char ch; 	 	do	 	{	 		printf("请输入一元二次方程的三个系数:\n"); 		printf("a = "); 		scanf("%lf", &a); 		 		printf("b = "); 		scanf("%lf", &b); 		 		printf("c = "); 		scanf("%lf", &c); 		 		delta = b*b - 4*a*c; 		 		if (delta > 0) 		{ 			x1 = (-b + sqrt(delta)) / (2*a); 			x2 = (-b - sqrt(delta)) / (2*a); 			printf("有两个解，x1 = %lf, x2 = %lf\n", x1, x2); 		} 		else if (0 == delta) 		{ 			x1 = x2 = (-b) / (2*a); 			printf("有唯一解，x1 = x2 = %lf\n", x1, x2); 		} 		else 		{ 			printf("无实数解!\n"); 		}  		printf("您想继续么(Y/N): "); 		scanf(" %c", &ch);  //%c前面必须得加一个空格 原因略 	} while ('y'==ch || 'Y'==ch); 	 	return 0; } 而且可以实现多个一元二次函数的求解  谢谢  不过空格是为什么啊？

user: user-0
content: 引用 1 楼 u012421456 的回复:[quote=引用 楼主 u012954691 的回复:] g=b*b-4*a*c; x1=(-b+g)/2*a; x2=(-b-g)/2*a; 这里用 g 是应该是用它的平方根吧! lz你加一个sqrt() 试试[/quote]  蛋疼了 这个没想到

user: user-1
content: 我也是个新手，对lz代码里的一些东西表示不懂

user: user-1
content: 感觉lz的代码不太好，这是一种写法： # include <stdio.h> # include <math.h>  int main(void) { 	double a, b, c;	 	double delta; 	double x1, x2;	 	char ch; 	 	do	 	{	 		printf("请输入一元二次方程的三个系数:\n"); 		printf("a = "); 		scanf("%lf", &a); 		 		printf("b = "); 		scanf("%lf", &b); 		 		printf("c = "); 		scanf("%lf", &c); 		 		delta = b*b - 4*a*c; 		 		if (delta > 0) 		{ 			x1 = (-b + sqrt(delta)) / (2*a); 			x2 = (-b - sqrt(delta)) / (2*a); 			printf("有两个解，x1 = %lf, x2 = %lf\n", x1, x2); 		} 		else if (0 == delta) 		{ 			x1 = x2 = (-b) / (2*a); 			printf("有唯一解，x1 = x2 = %lf\n", x1, x2); 		} 		else 		{ 			printf("无实数解!\n"); 		}  		printf("您想继续么(Y/N): "); 		scanf(" %c", &ch);  //%c前面必须得加一个空格 原因略 	} while ('y'==ch || 'Y'==ch); 	 	return 0; } 而且可以实现多个一元二次函数的求解

user: user-1
content: 引用 楼主 u012954691 的回复:g=b*b-4*a*c; x1=(-b+g)/2*a; x2=(-b-g)/2*a; 这里用 g 是应该是用它的平方根吧! lz你加一个sqrt() 试试
user-0 提问: 关于收到的数据帧的处理！

回复:
user: user-1
content: 这错误，哎！！  以后用这种写法吧  if(0 == i)

user: user-2
content: 你的这句判定少写了一个等号，于是变成赋值，偏巧值为0,于是跳过了文件创建。  if(i=0)

user: user-3
content: 引用 6 楼 sanredfish 的回复:你的这句判定少写了一个等号，于是变成赋值，偏巧值为0,于是跳过了文件创建。  if(i=0) 正解！

user: user-1
content: RETURN VALUE        Upon successful completion fopen(), fdopen() and freopen() return a FILE pointer.  Otherwise, NULL is returned and errno is set  to        indicate the error.  ERRORS        EINVAL The mode provided to fopen(), fdopen(), or freopen() was invalid.         The  fopen(),  fdopen()  and  freopen()  functions may also fail and set errno for any of the errors specified for the routine mal‐        loc(3).         The fopen() function may also fail and set errno for any of the errors specified for the routine open(2).         The fdopen() function may also fail and set errno for any of the errors specified for the routine fcntl(2).         The freopen() function may also fail and set errno for any of  the  errors  specified  for  the  routines  open(2),  fclose(3)  and        fflush(3).  看看 errno

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:void packet_handler(u_char *dumpfp, const struct pcap_pkthdr *header, const u_char *pkt_data) {     static int i=0;     static u_char filename[256];     printf("in packet handler\n");     if(i=0) {         strncpy((char*)filename,(const char *)pkt_data+18,255);filename[255]=0;         i=1;     } else {/*处理一帧*/         savetofile(filename,pkt_data);     }     return; } void savetofile(u_char *filename,const u_char *pkt_data) {     FILE *onfile;     if((onfile=fopen((char*)filename,"ab"))==NULL) {         printf("[%s]文件打开失败",filename);         exit(0);     }     fwrite(pkt_data+18,1,542,onfile);     fclose(onfile);     return ; } 不行啊。。。还是显示打开失败，昨天用这个还是可以的，只是存在丢包问题，今天不知道怎么的就不行了

user: user-0
content: 引用 1 楼 zhxianbin 的回复:文件存在吗？？？ 不存在的话不是会创建的吗？

user: user-3
content: void packet_handler(u_char *dumpfp, const struct pcap_pkthdr *header, const u_char *pkt_data) {     static int i=0;     static u_char filename[256];     printf("in packet handler\n");     if(i=0) {         strncpy((char*)filename,(const char *)pkt_data+18,255);filename[255]=0;         i=1;     } else {/*处理一帧*/         savetofile(filename,pkt_data);     }     return; } void savetofile(u_char *filename,const u_char *pkt_data) {     FILE *onfile;     if((onfile=fopen((char*)filename,"ab"))==NULL) {         printf("[%s]文件打开失败",filename);         exit(0);     }     fwrite(pkt_data+18,1,542,onfile);     fclose(onfile);     return ; }

user: user-1
content: 文件存在吗？？？
user-0 提问: 怎么使用openssl的crypto库呢？

回复:
user: user-1
content: http://yuanshuilee.blog.163.com/blog/static/2176972752013113035156535/ 你可以参考上面的博客，安装openssl以及md5测试代码。 openssl sha1 tmp.c 即可。

user: user-0
content: 引用 1 楼 user-2 的回复:只是需要计算hash用下个MD5库不就可以了  MD5和sha1的结果长度不一样啊。。。

user: user-2
content: 只是需要计算hash用下个MD5库不就可以了
user-0 提问: 飞机大战

回复:
user: user-1
content: 步步高 学习机吗

user: user-2
content: 打飞机我觉得去东莞学习比较好...

user: user-3
content: 现在还用不到，不过再过一段时间可能用到，先留下来

user: user-4
content: 收藏了，喜欢收藏

user: user-5

user: user-6
content: 这个估计有点难，先收藏了。以后有时间再看
user-0 提问: C显示图片问题求助

回复:
user: user-1
content: free必须和malloc之类的函数配对使用，否则就会出现异常。 Image_Buf不知道哪里申请的内存。 而numOfReadBytes更是不需要free

user: user-2
content: 如果没有使用操作系统(linux),建议不要使用动态内存
user-0 提问: 关于字符数组输出中++i和i++问题。

回复:
user: user-1
content: 引用 楼主 mywdlgx 的回复:char s1[38]="www.yjxsoft"; 	char s2[]=".com"; 	int i,j; 	i=j=0; 	 //计算 s1的长度,当s1[i]不为0时一直循环，直到s1[i]==0时退出循环，从而移到s1字符串末尾 也就是s[i]=='\0'处 	while(s1[++i]); 	printf("%d\n",i); 	//当j下标未指向'\0'时 逐一复制字符至s1末尾 	while (s2[j]) 	{ 		s1[i++]=s2[j++]; //这里用后置++表示 先对s1[i]=s2[j]后 才对i和j进行自增1操作 	} 	printf("%s \n",s1); 红字处换位i++就不行了，按理说换成i++只会比++i多出一个空字符啊，为啥不行呢？求教空字符代表结束吧~~后面不应该有字符了~~个人理解~~

user: user-2
content: ++i是先使i自身+1然后再取值，所以while(s1[++i]);第一次读到的是s1[1]不是s[0]，最后一个读到的'\0'时，i正好在这个位置上。 如果是i++的话，先取值后+1，那么开始是s[0]，当s[i++]为'\0'时，i会在'\0'的下一个位置上，所以需要在while循环后，进行i--

user: user-3
content: i = 0; while(s1[i++]); //s1[i-1] == '\0', s[i]也等于'\0' int tmp = i - 1; while (s2[j]) { s1[i++]=s2[j++]; //这里用后置++表示 先对s1[i]=s2[j]后 才对i和j进行自增1操作 }  //这样s1中间s1[tmp]为'\0',字符穿到这里结束了

user: user-0
content: 引用 1 楼 user-3 的回复:char s1[38]="www.yjxsoft"; char s2[]=".com"; int i,j; i=j=0;  //计算 s1的长度,当s1[i]不为0时一直循环，直到s1[i]==0时退出循环，从而移到s1字符串末尾 也就是s[i]=='\0'处 i = -1; //加上这句 while(s1[++i]); printf("%d\n",i); //当j下标未指向'\0'时 逐一复制字符至s1末尾 while (s2[j]) { s1[i++]=s2[j++]; //这里用后置++表示 先对s1[i]=s2[j]后 才对i和j进行自增1操作 }为啥。。。。我想知道原因。。。- -呃

user: user-3
content: char s1[38]="www.yjxsoft"; char s2[]=".com"; int i,j; i=j=0;  //计算 s1的长度,当s1[i]不为0时一直循环，直到s1[i]==0时退出循环，从而移到s1字符串末尾 也就是s[i]=='\0'处 i = -1; //加上这句 while(s1[++i]); printf("%d\n",i); //当j下标未指向'\0'时 逐一复制字符至s1末尾 while (s2[j]) { s1[i++]=s2[j++]; //这里用后置++表示 先对s1[i]=s2[j]后 才对i和j进行自增1操作 }
user-0 提问: GDB 调试

回复:
user: user-1
content: 引用 6 楼 u012889234 的回复:在 logger_init__处打断点没问题， 问题是在它的调试者logger_create 处打断点，单步执行到logger_init__() 在这里再 s 为什么进不去？ 看看汇编，call xxx的地方可以s

user: user-0
content: 在 logger_init__处打断点没问题， 问题是在它的调试者logger_create 处打断点，单步执行到logger_init__() 在这里再 s 为什么进不去？

user: user-1
content: 直接在 logger_init__(Logger *logger)里面加断点。

user: user-2
content: 先 break logger_init__ 再从头开始运行 如果还是不行， 重新编译。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:step：简记为 s ，单步跟踪程序，当遇到函数调用时，则进入此函数体（一般只进入用户自定义函数）。 next：简记为 n，单步跟踪程序，当遇到函数调用时，也不进入此函数体；此命令同 step 的主要区别是，step 遇到用户自定义的函数，将步进到函数中去运行，而 next 则直接调用函数，不会进入到函数体内。  break 函数名：在用户定义的函数“函数名”处设置断点，如：break logger_init__ 我是执行的  s 命令啊。 但是没有进入 logger_init__函数。直接跳到下一行了。

user: user-2
content: step：简记为 s ，单步跟踪程序，当遇到函数调用时，则进入此函数体（一般只进入用户自定义函数）。 next：简记为 n，单步跟踪程序，当遇到函数调用时，也不进入此函数体；此命令同 step 的主要区别是，step 遇到用户自定义的函数，将步进到函数中去运行，而 next 则直接调用函数，不会进入到函数体内。  break 函数名：在用户定义的函数“函数名”处设置断点，如：break logger_init__

user: user-0
content: 都过节去了吗？
user-0 提问: c primer plus书中程序清单15.4这里完全看不懂啊

回复:
user: user-1
content: “#define OPAQUE          0x1”后面一连串声明的数值是怎样来的？ 自己编的，只要保证使用不同的二进制位就行。  union Views     {     struct box_props st_view;     unsigned int     ui_view;（这里我咋没找到赋值的语句呢？直接就把ui_view作为参数show_settings1 };  解释下show_settings1(box.ui_view)这个函数是怎么运作的，看不明白。  这是联合体，自己百度查，我不知道怎么回答。我觉得根本就不需要赋值语句。

user: user-2
content: 也在学这本书的飘过~~

user: user-0
content: 引用 3 楼 user-3 的回复:引用 2 楼 u012757050 的回复:引用 1 楼 user-3 的回复:我原以为“这里”是“这里” 没想到是“这堆”。。。菜鸟 伤不起。。具体一点吧  这样工作量太大了“#define OPAQUE          0x1”后面一连串声明的数值是怎样来的？  union Views     {     struct box_props st_view;     unsigned int     ui_view;（这里我咋没找到赋值的语句呢？直接就把ui_view作为参数show_settings1 };  解释下show_settings1(box.ui_view)这个函数是怎么运作的，看不明白。  问题多多，麻烦了。

user: user-3
content: 引用 2 楼 u012757050 的回复:引用 1 楼 user-3 的回复:我原以为“这里”是“这里” 没想到是“这堆”。。。菜鸟 伤不起。。具体一点吧  这样工作量太大了

user: user-0
content: 引用 1 楼 user-3 的回复:我原以为“这里”是“这里” 没想到是“这堆”。。。菜鸟 伤不起。。

user: user-3
content: 我原以为“这里”是“这里” 没想到是“这堆”
user-0 提问: 关于printf输出问题

回复:
user: user-1

user: user-2
content: 后面不是注释了吗？ 最后一行，先输出的是 j 的值，经过上面的 j--，j已经变成了1，最后一行的输出结果先是1，而里边的那个printf里边\n\n%d，算三个字符，所以输出3，如果你去掉一个\n，即最后一个语句会变成这样 printf("%d",printf("\n%d",j)); //printf 返回打印的字符的数目，则输出结果变成了 1   1 12Press any key to continue

user: user-3
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-4
content: printf("%d  %d ",MIN(i,j--),j);//宏展开 printf("%d  %d ", ( (i) <= (j--) ? (i):(j--) ),j); //1<=2(j--，表示先取j的值，再自减）所以表达式为TRUE,就取第一个值 //(i)，所以后面那个j--没有被执行，此时j为1；   printf("%d",printf("\n\n%d",j));  //首先执行第一个printf("\n\n%d",j)，此时j为1，那么打印出1，当然前面还有2个回车， 所以printf返回3，再执行printf("%d",3);打印出3，由于回车只是在前面，所以这里1和3就连在一起， 出现13

user: user-5
content: 不要纠缠这种代码了，未定义行为
user-0 提问: c语言新手请教一个循环给字符串指针数组赋值的问题

回复:
user: user-1
content: 纠正上帖： char* STR_CHOICE_D[50]; char str[70]; char *p; int n; p=str; for(int i=0;i<3;i++) {     n=sprintf(p,"%c",'A'+i);     STR_CHOICE_D[i]=p;     p+=n+1; }  MessageBox( STR_CHOICE_D[0],"提示",MB_OK); // A MessageBox( STR_CHOICE_D[1],"提示",MB_OK); // B MessageBox( STR_CHOICE_D[2],"提示",MB_OK); // C

user: user-1
content: char* STR_CHOICE_D[50]; char str[70]; char *p; int n; p=str; for(int i=0;i<3;i++) {     n=sprintf(p,"%c",'A'+i);     p+=n+1;     STR_CHOICE_D[i]=p; }  MessageBox( STR_CHOICE_D[0],"提示",MB_OK); // A MessageBox( STR_CHOICE_D[1],"提示",MB_OK); // B MessageBox( STR_CHOICE_D[2],"提示",MB_OK); // C

user: user-2
content: U8 str[70]; 这个是什么？

user: user-3
content: 改为如下的试试：  //char* STR_CHOICE_D[50]; char STR_CHOICE_D[50][70]; U8 str[70]; for(i.....){ 	//此处改变str的值 	//STR_CHOICE_D[i]=str;         memcpy(&STR_CHOICE_D[i][0], &str[0], 70); }   引用 楼主 juyangjia 的回复: char* STR_CHOICE_D[50]; U8 str[70]; for(i.....){ 	//此处改变str的值 	STR_CHOICE_D[i]=str; }  MessageBox( STR_CHOICE_D[0],"提示",MB_OK); //期望应该等于  A  实际输出 C   MessageBox( STR_CHOICE_D[1],"提示",MB_OK); //期望应该等于  B  实际输出 C MessageBox( STR_CHOICE_D[2],"提示",MB_OK); //期望应该等于  C  实际输出 C  //也就是所有数组都保存着最后一个字符串，我猜是因为str赋值给STR_CHOICE_D[i]的时候赋的是地址，所有下标都指向的同一个地址   怎么解决这个问题？
user-0 提问: 新手对这个程序有点不懂，求解答

回复:
user: user-1
content: 这个有点故弄玄虚了，其实数组指针，跟数组名一个意思，因为数组名也代表了数组的起始地址。

user: user-2
content: 数组指针的用法， char (*ss)[M] ; ss指向一个维数为M的数组。
user-0 提问: 表达式求值，出现链接错误，望大神指教

回复:
user: user-1
content: 这个main。应该改一下。

user: user-2
content: main函数名修改下，再有错误贴出信息

user: user-3
content: main函数的main单词还真是写错了哦！

user: user-4
content: main函数的main单词写错了

user: user-5
content: 贴出错误说明，方便回答

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

回复:
user: user-1
content: 你好，你的问题我也遇到了，可以加你qq和你交流一下吗

user: user-0
content: 这个问题是由于socket的属性设置在bind之前做了，我把广播属性设置相关的动作放到bind之后就好了。

user: user-2
content: 引用 6 楼 kenchowcn 的回复:[quote=引用 4 楼 alexmayer 的回复:] 求一个测试工具的新版安装包  onvif device test tool version 13.12  我上传了你要的版本,要一分,意思一下,我也是忽然发现我自己没有分了. http://download.csdn.net/detail/kenchowcn/6990403[/quote]   多谢！

user: user-0
content: 引用 4 楼 alexmayer 的回复:求一个测试工具的新版安装包  onvif device test tool version 13.12  我上传了你要的版本,要一分,意思一下,我也是忽然发现我自己没有分了. http://download.csdn.net/detail/kenchowcn/6990403

user: user-0
content: 引用 3 楼 hcywcx 的回复:Probe应该是设备端程序启动后主动发送。我也看了那个程序，__wsdd__Proble没被调用。求交流, 569493867  加QQ群:7622995,一起交流.已经很多人都做这个在这个群里面.

user: user-3
content: 很久以前搞过onvif，我记得那时的问题是使用的soap命名空间版本不对造成的。其实就是nsmap文件里面的地址。 现在不太记得，要找找代码才行。

user: user-2
content: 求一个测试工具的新版安装包  onvif device test tool version 13.12

user: user-4
content: Probe应该是设备端程序启动后主动发送。我也看了那个程序，__wsdd__Proble没被调用。求交流, 569493867

user: user-0
content: 引用 1 楼 user-5 的回复:我顶你一下。。。。不懂 谢谢！

user: user-5
content: 我顶你一下。。。。不懂
user-0 提问: 同一段程序，单独运行可以，接在另一个程序后面编译错误

回复:
user: user-1
content: #include  <stdio.h>

user: user-2
content: 把贴过去之后的大程序发出来

user: user-3
content: 你那个大程序是cpp后缀吧

user: user-4
content: 把定义：FILE *filei;FILE *fileo; 贴到你的大程序的最前面位置 你的大程序后缀名是C的吗？

user: user-5
content: 根据错误提示来看，你的FILE *filei; FILE *fileo;是不是没有申明？  建议你直接将封装一个函数，然后，丢到大的程序里面跳用。
user-0 提问: 二十进制数的加法 求教

回复:
user: user-0
content: 谢谢。。。。

user: user-1
content: 引用 5 楼 zhao4zhong1 的回复:base is between 2 and 36: long strtol( const char *nptr, char **endptr, int base ); char *_ltoa( long value, char *string, int base );  意思就是这两个函数支持2～36进制的转换。 你要实现20进制的加法，只要先用strtol将两个要加的20进制数转为10进制数，相加，再将结果用ltoa函数转为20进制数即可。

user: user-0
content: 没有明白，请大神详细一点

user: user-1
content: base is between 2 and 36: long strtol( const char *nptr, char **endptr, int base ); char *_ltoa( long value, char *string, int base );

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: 确实很多新手不喜欢调试, 很多问题单步调试, 问题就简单明了的摆在哪里.

user: user-3
content: 楼主这个程序不完整。没有引用string.h，主函数也没有写完，你是怎么测试数据不通过的？

user: user-4
content: 谁给置顶一个各个编译器的debug步骤 我送500可用分！
user-0 提问: 一个年过完之后东西忘的差不多了，大神帮我看看结果。

回复:
user: user-0
content: 引用 2 楼 zhxianbin 的回复:char str[10] = “hello.c/”; char (*p)[10] = str ; int n = 10;  sizeof (str ) =9 ？  //应该等于 10 吧 strlen(str)=8 ? //数一下，不包含 \0 sizeof ("abcdef") =7 ? //数一下，包含 \0 sizeof ("abcdef" + 1) = 8? sizeof ( p ) = 40？  //不确定，我觉得是 4   sizeof ( n ) = 4？                      void Foo ( char str[100]){                          sizeof( str ) = 4？  //指针的长度                   void *p = malloc( 100 );  sizeof ( p ) = 4？; //指针的长度 好像是的 等于4

user: user-1
content: char (*p)[10] = str ;//这个编译错误的会；一个是指针，一个是指向数组的指针 //应该改成：  char (*p)[10]= &str;//所以本意还是指针，sizeof还是4(32位)

user: user-2
content: char str[10] = “hello.c/”; char (*p)[10] = str ; int n = 10;  sizeof (str ) =9 ？  //应该等于 10 吧 strlen(str)=8 ? //数一下，不包含 \0 sizeof ("abcdef") =7 ? //数一下，包含 \0 sizeof ("abcdef" + 1) = 8? sizeof ( p ) = 40？  //不确定，我觉得是 4 sizeof ( n ) = 4？                      void Foo ( char str[100]){                          sizeof( str ) = 4？  //指针的长度                   void *p = malloc( 100 ); sizeof ( p ) = 4？; //指针的长度

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

回复:
user: user-1
content: 我觉得最重要的区别是, 1可以适用于其它数据. 而2已经定死了, 只能对read_dat操作.

user: user-2
content: 不明白！第二种写法不需要返回一个值吗？

user: user-3
content: 第1种写法比第2种写法多了一个传值过程。 如果调用第1种写法：void f1(&read_dat)，事实上是先把&read_dat的值传给了函数f1()的参数result，然后再在f1()中使用reslut。而对于第2种写法就是直接使用&result，就少了这个传值过程了。事实上，两种方式达到的效果是一样的。 最后要说明的是，你第2种写法没有u8类型的返回值。

user: user-4
content: 依赖不一样！

user: user-5
content: 从指针来看没什么区别啊

user: user-6
content: 若不需要改变全局变量，则用第一种； 若必须改变全局变量，则用第二种，有时这是必须的。

user: user-7
content: 第一种是参数传递，第二个是全局变量 如版主所说，最大的区别是函数返回值类型不同。。

user: user-8
content: u32 read_dat = 0;  u8 f1()  {     pr->rxdat = (void *)&read_dat;     getdat(pr);  }  这个函数重入就危险了...

user: user-9
content: 第二个感觉问题蛮多的

user: user-10
content: 引用 楼主 dsoyy 的回复:1、 void f1(u32* result) {    pr->rxdat = result;    getdat(pr); } 2、 u32 read_dat = 0; u8 f1() {    pr->rxdat = (void *)&read_dat;    getdat(pr); }  着两种写法的区别是什么？  rxdat的类型是什么?

user: user-11
content: 第一个看不出什么问题来  第二个的话，问题太多了，跟这样的人做同事我会觉得恐怖 u32 read_dat = 0;         //尽量避免使用全局变量 u8 f1()                   //危险，不会进行参数检查 {    pr->rxdat = (void *)&read_dat;    //强制类型转换，慎用，随意使用void指针是不负责任的表现    getdat(pr); }

user: user-12
content: 最主要的区别就是第二个有返回值...

user: user-13
content: &read_dat的结果就是u32*，你要的区别是什么？

user: user-14
content: 在内存的位置不一样

user: user-15
content: 一个用函数参数一个用全局变量。

user: user-0
content: 那就是没区别了

user: user-16
content: pr->rxdat = result; 下面有做指针转换~ pr->rxdat = (void *)&read_dat;

user: user-17
content: 区别。。。。。。。
user-0 提问: 可以用c语言写出消除之星完全消除的程序吗

回复:
user: user-0
content: 我再顶，最多顶三次。

user: user-1
content: 崩溃就调试啊  赵老师上！

user: user-0
content: 汗，后来想了下，逻辑不通，因为筛选的时候，需要保存很多很多的数据，但是我又没办法将数据一一保存，只要改变一次就凌乱了。这个办法应该不通。求大神。

user: user-2
content: step by step

user: user-3
content: 学编程，应该从写helloworld开始就学会单步调试 所有写了一大篇代码却只能编译运行测试结果的初学者技能树都点歪了

user: user-0
content: 汗，没人，自己顶
user-0 提问: 虚拟键问题

回复:
user: user-1
content: 要用KeyDown或者是KeyUp来判别，RawKey的话很可能会是多次。  引用 楼主 wangli1000000 的回复:#define _WIN32_WINNT    0x0500  //必须在开头  #include <stdio.h> #include <windows.h>  HANDLE hInput;  /*  获取标准输入设备句柄 */ INPUT_RECORD inRec;/*  返回数据记录 */ DWORD numRead; /*  返回已读取的记录数 */   int main() {        COORD pos = {0,0}; char ch;     HWND hwnd=GetConsoleWindow();/*  控制台窗口句柄 */     hInput = GetStdHandle(STD_INPUT_HANDLE); /*  输入设备句柄 */     while(1){					         	 	    ReadConsoleInput(hInput, &inRec, 1, &numRead); 						 			// 键盘事件              if (inRec.EventType == KEY_EVENT){                if (inRec.Event.KeyEvent.wVirtualKeyCode ==VK_F1)                   ShellExecute(NULL,"open","帮助.exe",NULL,NULL,SW_SHOW);                                if (inRec.Event.KeyEvent.bKeyDown) {                    ch =  inRec.Event.KeyEvent.uChar.AsciiChar;                  if(ch=='q')printf("演示.\n");                 }                                  if (inRec.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) break;                                                                                                }                         // end键盘事件                }  }  请问：为什么按下F1键，ShellExecute(NULL,"open","帮助.exe",NULL,NULL,SW_SHOW); 语句执行了两次。  怎么才能只执行一次？

user: user-2
content: if (inRec.Event.KeyEvent.bKeyDown) ｛ if (inRec.Event.KeyEvent.wVirtualKeyCode ==VK_F1)                   ShellExecute(NULL,"open","帮助.exe",NULL,NULL,SW_SHOW); ｝

user: user-2
content: 你按q，显示几次“演示”
user-0 提问: 求助，关于指针数组argv的问题

回复:
user: user-1
content: argv是OS帮你解析完命令行参数填好的，不用自己处理

user: user-2
content: 可以简单的认为 argv[i] 是个只读参数。 这个参数，只是传递命令行参数用的,不是让你改着玩的。 唯一可改变的，是指针argv 的值而已，一般也就是让她不断增加。 PS： 这个参数， 是C库中的初始化程序， 分析命令行参数后，建立的一个指针数组，其中每个指针指向一个命令行参数 分析完成后，做一些数据的初始化工作，然后调用main 函数，参数参数个数和命令行数组  所以，一般用户程序，都是从main 函数开始启动的。 用户编写的代码，是从main 开始正式工作的。 不要企图改变，任何一个命令行参数。  这些参数，只是由C库中的初始化程序，调用main 函数用的。 main 函数只需要使用他们就行了，需要改变这些数据，可以复制他们，然后修改。 main 函数执行到这里，已经被调用过了，改变参数并不能改变命令行本身。  用户程序，是在main 函数执行过程中执行的 用户程序，一般就是main 函数内部的代码，这些代码再去调用别的函数，执行别的代码。

user: user-3
content: int main(int argc, char **argv); argv参数可以看成:   char *argv[argc];  argc和argv参数是由main函数的调用者设置的，如果argv == 1, 则argv只分配了1个char*的内存,即argv[0]。 而你想往argv[1]和argv[2]里面存东西，肯定不行啊，内存都没分配，咋存？
user-0 提问: 这里人多，广撒网多捞鱼！

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:lea？ 同志是powerpc32的指令啊，我是觉得lea面熟啊，结果x86的啊

user: user-0
content: 引用 1 楼 user-1 的回复:lea？ 我试试

user: user-1
content: lea？

user: user-1
content: O(∩_∩)O~ 没接触过你说的那个 查下指令手册
user-0 提问: 怎样通过sizeof或别的方式获取指针变量所占空间大小

回复:
user: user-1
content: 32位系统, 4字节, 64位8字节

user: user-2
content: 现在好多了,16Bits有两种指针长度 near * 16 Bits,far* 32Bits 32Bits不约而同的省掉了far指针(48Bits)  64 没用过,不清楚 C51 3种指针长度8Bits,16Bits,24Bits 通用24Bits xdata*,code* 16Bits data* 8Bits

user: user-3
content: 四个字节：sizeof(void*)

user: user-4
content: 引用 2 楼 akirya 的回复:sizeof(void*)  就是sizeof(void*)

user: user-5
content: 引用 15 楼 bruceteen 的回复:在 LLP64 模式下，long 是 32bits，而指针是 64bits 在C语言中，有个标准的类型名 intptr_t  一直以为(unsign long) == sizeof(void*)，微软与众不同啊。

user: user-6
content: 看看这篇博文 被人误解的SIZEOF

user: user-7
content: 在 LLP64 模式下，long 是 32bits，而指针是 64bits 在C语言中，有个标准的类型名 intptr_t

user: user-8
content: 看编译器，sizeof（void *）才是最靠谱的

user: user-9
content: 主要是看编译器的，

user: user-10
content: 在《Linux Driver Device 》中确实提到了这个取巧的方式，就是长整形长度等于指针长度。是一个经验说法。具体宽度最准的还是看编译器。

user: user-11
content: 还是通过sizeof判断吧

user: user-12
content: 大家都这么说,32位系统, 4字节, 64位8字节

user: user-13
content: 引用 8 楼 lin5161678 的回复:[quote=引用 7 楼 u013470052 的回复:] 指针变量就是一个地址，也就是长整形的数，长整形的数占几位，指针变量就占几位。没这回事  别把看到的巧合当成真理[/quote]

user: user-14
content: 引用 7 楼 u013470052 的回复:指针变量就是一个地址，也就是长整形的数，长整形的数占几位，指针变量就占几位。没这回事  别把看到的巧合当成真理

user: user-13
content: 指针变量就是一个地址，也就是长整形的数，长整形的数占几位，指针变量就占几位。

user: user-15
content: 数据模型。。

user: user-16
content: readelf（linux）

user: user-17
content: sizeof的结果是编译器告诉你的。

user: user-14
content: 和编译器的目标平台有关

user: user-18
content: sizeof(void*)
user-0 提问: 一个错误程序~~求指教什么原因导致这种显示结果~~这个程序本身是错的~~是不是scanf()的原因

回复:
user: user-0
content: 引用 2 楼 chenyegui 的回复:没初始化。。值不确定没初始化但是装入输入scanf的值了~~而且就算是因为没有初始化，也应该第一个值开始就是垃圾值啊~~

user: user-1
content: 没初始化。。值不确定

user: user-2
content: double i[8],j[8], s = 0;  s+=i[m]; j[m] = s;  应该做上述改动。 因为j[8]没有初始化，当m>1时，j[m] += i[m]的时候，j[m]原有的值未知。