Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求大神帮忙看下问题在哪

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-2
content: %s对应的不是字符串指针

user: user-3
content: 1.结构体中定义学号为整型，但输入时却是字符串类型的 2.计算平均分总和时stu[i].avg=stu[i].sum/4应放在第二个循环的外面，否则计算的是没门科目的四分之一 3.按总分从高到低排序时，stu[i+1].sum下标越界了，超过最大的6了，而且排序的方法也不对，可以用选择排序或冒泡排序。

user: user-4
content: 最后一个函数调用stu[i+1]越界了

user: user-5
content: 问题1：number是int类型，但是输入的格式是按照%s输入的:scanf("%s", &stu[i].number); 问题2：fun0中有逻辑错误，即stu[i].avg = stu[i].sum / 4;应该放在第二层循环外。 问题3：fun1中，出现越界问题（这个是导致程序异常退出的直接原因），i+1已经在i=5时，越界。 因此应改成： for (i = 0; i < 6 - 1; i++ 另外，排序还存在逻辑错误。排序是需要2层循环的，建议查一下冒泡排序算法。

user: user-6
content: fun1中 循环中i = 5时，stu[i+1]越界访问了

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }
user-0 提问: [Clion问题] Cmake project is not loaded

回复:
user: user-1
content: 不晓得楼主看懂没得，反正我是看不懂，没得前提，直接说的是啥？？project是什么类型文件？？？感觉这些都是混子

user: user-2
content: 不要打开之前的代码，新建一个project把代码粘贴过去，这样系统会自动为你写Cmake文件，不然就要你自己写

user: user-3
content: https://segmentfault.com/a/1190000020884684

user: user-4
content: 就一句话，新建project，不要打开已经有的project，新建project系统会自己给你写CMakeLists.txt文件
user-0 提问: 为什么在visual studio2013中 “strcpy”不合法，那下面这个程序该怎么改呢

回复:
user: user-1
content: strcpy_s比strcpy安全 就和 五十步笑百步 一样！  #pragma warning(disable:4996) //开头加这句或项目、属性、配置属性、C/C++、预处理器、预处理器定义中添加“_CRT_SECURE_NO_WARNINGS”

user: user-2
content: strcpy_s(m_name, name, 20);  试一下这个函数。 strcpy_s是安全封装的strcpy

user: user-3
content: strcpy_s
user-0 提问: 遇到蛋疼问题特来求教,望各位大神赐教..

回复:
user: user-1
content: 也可以将c中的bool统一更名为your_bool， 避免与c++的bool类型冲突

user: user-2
content: c++中的bool不是宏定义的，是一种基本类型  你可以用#ifdef判断是否是C代码，把你那部分代码放到相应条件下
user-0 提问: 求助TAT感觉代码好像没错但是OJ过不了

回复:
user: user-1
content: if(qz>=qb)         q=qz;     else         q = qb; 这个地方是不是应该改成这样？ 因为你的输入不一定是qz >= qb，也可能是qz < qb呢

user: user-0
content: 描述： A与B是两个非负十进制整数（0 <= A,B <= 1e8），求A加B运算包含几次进位操作（逢十进一）。 输入： 输入包含两个非负整数A和B，空格隔开。 输出： 一个整数，表示进位次数。 输入样例： 1901 1609 输出样例： 2  Hint: 个位1+9进1，百位9+6进1，共2次  这是题目~
user-0 提问: 使用fgetc()读文件错在哪了啊？

回复:
user: user-0
content: 十分感谢！！

user: user-1
content: while(ch=(fgetc(in))!=EOF) 改一下，改成如下：注意括号的位置，否则会变成ch = (getc(in) != EOF)，因为赋值运算符的优先级最低。 while((ch=fgetc(in))!=EOF)

user: user-2
content: 引用 1 楼 cfjtaishan 的回复:while(ch=(fgetc(in))!=EOF) 改一下，改成如下：注意括号的位置，否则会变成ch = (getc(in) != EOF)，因为赋值运算符的优先级最低。 while((ch=fgetc(in))!=EOF)++
user-0 提问: 请教下如何在预编译的时候将__FUNCTION__和字符串拼接起来

回复:
user: user-1
content: 引用 2 楼 u011955950 的回复:多谢指教，__LINE__是可以展开；但是__FUNCTION__好像就没有办法展开出来？我试了下不行，可以再指教下吗？ 改用代码生成技术。 代码生成技术参考：//codegen.c // 输入一组字符串，比如 // aa ss ddd dd 33 dd // 然后自动生成一个函数 int A(const char*); // 实现A("aa")返回0  A("ss")返回1 依次类推 #include <stdio.h> int main(int argc,char **argv) {     int i;     if (argc<2) {         printf("%s p1 [p2 ...] [>result.c]\nGenerate code int A(const char *a); 0==A(\"p1\") 1==A(\"p2\") ...",argv[0]);         return 1;     }     //printf("#include <string.h>\n");     printf("int A(const char *a) {\n");     for (i=0;i<argc-1;i++) {         printf("    if (0==strcmp(a,\"%s\")) return %d;\n",argv[i+1],i);     }     printf("    return -1;\n");     printf("}\n");     return 0; } //C:\test\Debug>codegen.exe //codegen.exe p1 [p2 ...] [>result.c] //Generate code int A(const char *a); 0==A("p1") 1==A("p2") ... //C:\test\Debug>codegen.exe aa ss ddd dd 33 dd //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} // //c:\test\Debug>codegen.exe aa ss ddd dd 33 dd >result.c // //c:\test\Debug>type result.c //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} //

user: user-1
content: 仅供参考：#include <stdio.h> #define DEBUG2(x,y) "Line " #y " of File " x #define DEBUG1(x,y) DEBUG2(x,y) #define LINE_FILE DEBUG1( __FILE__ , __LINE__ )      const char *str = LINE_FILE; void main() {     printf("%s\n",str); } //Line 10 of File c:\tmp\tmp\foo.c

user: user-0
content: 多谢指教，__LINE__是可以展开；但是__FUNCTION__好像就没有办法展开出来？我试了下不行，可以再指教下吗？
user-0 提问: 使用VC2010编辑FOR循环的问题

回复:
user: user-1
content: 你的循环条件 i >= (1.0/5)在i还是正数的时候一直是真，直到i溢出成为负数才会结束。你这段代码其实得不到你预期的输出。  for 循环可以这样写 for（i==1；i<=100;i++） {     sum += 1/i; }  其他不用变了

user: user-2
content: 循环条件永远成立，无法停止

user: user-3
content: for (i = 1;i >= (1.0/5); 1.0/(i++) )里面的表达式中给i赋值的是i++ 就是的第二次i=2.0，第三次I=3.0，以此类推 i的值一直大于1.0/5 所以程序一直循环下去 也就是死循环 可以修改成   int main()    {   double i;   double sum = 0;          for ( i = 1.0;i <=100.0; i++ )   {     sum = sum +1/ i;      }    printf("sum = %lf\n",sum);    system("pause");    return 0;    }

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

user: user-5
content: double sum = 1;            for (in= 1;n<100;n++ )       {    sum = sum + 1/n;  } for 里面的数要整数；

user: user-6
content: 死循环了
user-0 提问: win10用VC++6.0写的一个比较大小的程序，帮忙看下输出问题，

回复:
user: user-1
content: 注意中英文字符。建议输入a, b之后，马上输出一下a,b的值。这样保证调用max之前是自己输入的值。

user: user-2
content: +1，空格的锅，就几行代码你试试不要空格绝对没问题

user: user-3
content: 你输入的1，2中间逗号是英文还是中文、逗号后面有空格吗？输入要和scanf保持一致。

user: user-4
content: 仅供参考（输入两个整数，中间随便用什么间隔）：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-5
content: 可能是逗号的问题吧，，，

user: user-6
content: 不应该啊，明天上机试试

user: user-7
content: 你的电脑是假的吧

user: user-0

user: user-7
content: 把int max（）声明放main函数外面
user-0 提问: VS2010的BUTTON中怎样对text输入的数值用IF语句进行判断？

回复:
user: user-0
content: 谢谢大家谢谢

user: user-1
content: 你想问什么、思路已经这么清楚了、就按你说的一步步写代码就行了

user: user-2
content: CString::Compare int Compare( LPCTSTR lpsz ) const;  Return Value  Zero if the strings are identical, < 0 if this CString object is less than lpsz, or > 0 if this CString object is greater than lpsz.  Parameters  lpsz  The other string used for comparison.  Remarks  Compares this CString object with another string using the generic-text function _tcscmp. The generic-text function _tcscmp, which is defined in TCHAR.H, maps to either strcmp, wcscmp, or _mbscmp depending on the character set that is defined at compile time. Each of these functions performs a case-sensitive comparison of the strings, and is not affected by locale. For more information, seestrcmp, wcscmp, _mbscmp in the Run-Time Library Reference.  Example  The following example demonstrates the use of CString::Compare.  // example for CString::Compare CString s1( "abc" ); CString s2( "abd" ); ASSERT( s1.Compare( s2 ) == -1 ); // Compare with another CString. ASSERT( s1.Compare( "abe" ) == -1 ); // Compare with LPTSTR string.  CString Overview |  Class Members |  Hierarchy Chart  See Also   CString::CompareNoCase, CString::Collate, CString::CollateNoCase
user-0 提问: 关于strlen()

回复:
user: user-1
content: 无符号数和有符号数运算，好像有时会有些问题，这个你具体去查下

user: user-2
content: strlen返回值肯定大于等于0，你和负数也可以比较，比较结果总是真

user: user-3
content: 函数strlen()返回的是字符串的长度，应该>=0

user: user-4
content: 无符号

user: user-1
content: 引用 10 楼 a34140974 的回复:无符号数和有符号数运算，好像有时会有些问题，这个你具体去查下 查了下： 无符号与有符号数进行运算时，系统会自动将有符号数看成无符号数，然后进行比较。 举例：假定一个数是8位，一个字节表示 -1=11111111（补码），相当于无符号数255 10=00001010 此时，-1>10

user: user-5
content: 首先，strlen()返回值在不同c库的版本中不同，有的是int，有的是size_t(usigned int 或 unsigned long); 再次，你的问题应该是返回值是size_t的strlen()，这就是c/c++类型比较时的强制转换问题，rt.

user: user-6
content: 不能与负数比较是什么意思，警告还是错误？其实返回字符串的长度必定大于等于0，返回值应该是无符号整数，如果非要和有符号整数比较，可以强转啊！

user: user-3
content: strlen()返回的字符串的长度，应该>=0

user: user-7
content: 能不能比我不知道，但是没有必要比较啊，strlen（）返回值大于等于0，根本不需要和负数比较啊。

user: user-8
content: 引用 2 楼 user-10 的回复:strlen()得到是数据的类型的大小，必定>0 空串的strlen()得到是0吧

user: user-9
content: strlen()返回的是无符号整型

user: user-10
content: strlen()得到是数据的类型的大小，必定>0

user: user-8
content: strlen得到的返回值范围是：>= 0;跟负数比较没意义吧。 可以看一下strlen的原型，返回值是size_t，size_t是unsigned类型。
user-0 提问: linux下C语言工程编译不出来，求大神指点

回复:
user: user-0
content: 引用 7 楼 cfjtaishan 的回复:[quote=引用 6 楼 HelegeHeHeha 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] [quote=引用 3 楼 HelegeHeHeha 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 建议先make clean一下，然后再make试试   试过了好多次了，还是那个问题[/quote] 问一下，你的libcure.so库是交叉编译生成的吗？还是用gcc编译生成的。因为你使用交叉编译器编译你的代码，那么libcur.so也应该是交叉编译生成的。[/quote]   那个库是我在网上下的，怎么给他交叉编译呢，是不是要改库里的Makefile?[/quote] 那就不行了。 建议你改一下库里的makefile，将你的交叉编译器的路径替换原有编译器的（原有的编译器应该是使用gcc那个版本的）。 最终你需要先将libcur.so交叉编译生成才行[/quote]  那我想问一下这个.so文件在这里面起什么作用呢，我才开始搞这个，不太懂

user: user-1
content: 引用 6 楼 HelegeHeHeha 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] [quote=引用 3 楼 HelegeHeHeha 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 建议先make clean一下，然后再make试试   试过了好多次了，还是那个问题[/quote] 问一下，你的libcure.so库是交叉编译生成的吗？还是用gcc编译生成的。因为你使用交叉编译器编译你的代码，那么libcur.so也应该是交叉编译生成的。[/quote]   那个库是我在网上下的，怎么给他交叉编译呢，是不是要改库里的Makefile?[/quote] 那就不行了。 建议你改一下库里的makefile，将你的交叉编译器的路径替换原有编译器的（原有的编译器应该是使用gcc那个版本的）。 最终你需要先将libcur.so交叉编译生成才行

user: user-1
content: 引用 3 楼 HelegeHeHeha 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 建议先make clean一下，然后再make试试   试过了好多次了，还是那个问题[/quote] 问一下，你的libcure.so库是交叉编译生成的吗？还是用gcc编译生成的。因为你使用交叉编译器编译你的代码，那么libcur.so也应该是交叉编译生成的。

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:[quote=引用 3 楼 HelegeHeHeha 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 建议先make clean一下，然后再make试试   试过了好多次了，还是那个问题[/quote] 问一下，你的libcure.so库是交叉编译生成的吗？还是用gcc编译生成的。因为你使用交叉编译器编译你的代码，那么libcur.so也应该是交叉编译生成的。[/quote]   那个库是我在网上下的，怎么给他交叉编译呢，是不是要改库里的Makefile?

user: user-0
content: 问一下，你的libcure.so库是交叉编译生成的吗？还是用gcc编译生成的。因为你使用交叉编译器编译你的代码，那么libcur.so也应该是交叉编译生成的。[/quote]  那个库是我在网上下的，怎么给他交叉编译呢，是不是要改库里的Makefile?

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:建议先make clean一下，然后再make试试   试过了好多次了，还是那个问题

user: user-0
content: 试过了好多回，还是没有用

user: user-1
content: 建议先make clean一下，然后再make试试
user-0 提问: OSE架构下DSP开发   生成数组后 DA 不往出发数

回复:
user: user-1
content: 有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core或dmp文件、……这些方法都不行！ 写日志到文件参考下面： #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #pragma warning(disable:4996)     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef _MSC_VER void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef _MSC_VER     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef _MSC_VER     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-79行添加到你带main的.c或.cpp的那个文件的最前面 //81-86行添加到你的main函数开头 //90-94行添加到你的main函数结束前 //在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中
user-0 提问: eclipse的帮助文档

回复:
user: user-1
content: 使用WebCHM软件，可以将指定网页下载打包成一个chm文件。

user: user-0
content: 引用 1 楼 老马何以识途的回复:eclipse只是一個IDE，並不包含API 使用說明文檔可以去其官方網站下載 老哥，先谢谢你的回复啦。我找到了网页，但好像不知道它的那个下载的地方在哪里

user: user-2
content: eclipse只是一個IDE，並不包含API 使用說明文檔可以去其官方網站下載
user-0 提问: 关于指针的指针操作恳请大神答疑

回复:
user: user-1
content: 《牛肉干》 C语言上机课，某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上，卡在7和8键之间。 女同学就在键盘上抠啊、抠啊、抠啊…… 程序里一行代码变成这个样子： int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————程序顺利通过编译，运行结果正确！

user: user-2
content: 引用 5 楼 cfjtaishan 的回复:只能用prear = &p;而不能*prear = p;因为prear是野指针，prear = &p;是指针prear指向p的地址。 如果定义时把prear = NULL;那么运行时段错误是必现的。

user: user-0
content: 引用 3 楼 自信男孩的回复:scanf("%d",k); 这个地方也有问题：改成这样 scanf("%ld", &k); 非常感谢！这里疏忽了哈哈

user: user-2
content: scanf("%d",k); 这个地方也有问题：改成这样 scanf("%ld", &k);

user: user-2
content: 只能用prear = &p;而不能*prear = p;因为prear是野指针，prear = &p;是指针prear指向p的地址。

user: user-0
content: 引用 1 楼 user-3的回复:*prear=p; 改成prear = &p;试试看 回家试一试上班了hhhh谢谢！可以问一下这两句话之间有什么区别嘛

user: user-3
content: *prear=p; 改成prear = &p;试试看

user: user-2
content: 引用 8 楼 weixin_41974276 的回复:[quote=引用 6 楼 自信男孩的回复:][quote=引用 5 楼 cfjtaishan 的回复:] 只能用prear = &p;而不能*prear = p;因为prear是野指针，prear = &p;是指针prear指向p的地址。 如果定义时把prear = NULL;那么运行时段错误是必现的。[/quote] Hi你好！ 很感谢你为我解答，下午又查了很多资料，算是有些理解了，非常感谢！ 想追问一下，如果仍用*prear=p,但在之前为prear分配一个地址可否？[/quote] 恩，可以的。需要给prear分配一个指针大小的空间

user: user-2
content: 引用 9 楼 cfjtaishan 的回复:[quote=引用 8 楼 weixin_41974276 的回复:] [quote=引用 6 楼 自信男孩的回复:][quote=引用 5 楼 cfjtaishan 的回复:] 只能用prear = &p;而不能*prear = p;因为prear是野指针，prear = &p;是指针prear指向p的地址。 如果定义时把prear = NULL;那么运行时段错误是必现的。[/quote] Hi你好！ 很感谢你为我解答，下午又查了很多资料，算是有些理解了，非常感谢！ 想追问一下，如果仍用*prear=p,但在之前为prear分配一个地址可否？[/quote] 恩，可以的。需要给prear分配一个指针大小的空间[/quote] 但对这个程序来说没必要。就应该是：prear = &p;

user: user-0
content: 引用 6 楼 自信男孩的回复:[quote=引用 5 楼 cfjtaishan 的回复:] 只能用prear = &p;而不能*prear = p;因为prear是野指针，prear = &p;是指针prear指向p的地址。 如果定义时把prear = NULL;那么运行时段错误是必现的。[/quote] Hi你好！ 很感谢你为我解答，下午又查了很多资料，算是有些理解了，非常感谢！ 想追问一下，如果仍用*prear=p,但在之前为prear分配一个地址可否？
user-0 提问: 奇怪的%问题

回复:
user: user-0
content: 引用 8 楼 paschen 的回复:至于等于255的情况没能理解，你可以分析下你汇编 a%b - c    如果拆开成啊a=a%b   a=a-c  每步都有一个无符号的指令，如果写到一起就只有都计算完才有一个无符号的指令，差别就在这。挺奇怪的

user: user-1
content: 这个是C标准对转换的描述：http://en.cppreference.com/w/c/language/conversion  这个是MSDN给的：https://msdn.microsoft.com/en-us/library/aetzh118.aspx

user: user-1
content: 至于等于255的情况没能理解，你可以分析下你汇编

user: user-1
content: 引用 6 楼 nadleeh的回复:[quote=引用 5 楼 paschen 的回复:] 1楼说的不正确，s - e 比int小，s - e后的结果不是unsigned char类型，而是int类型，即int类型的-1，再转换成unsigned，即0xFFFFFFFF，十进制是4294967295  所以最后结果相当于是4294967295 % 128 = 127 版主，所有变量都当unsigned char就是int 是手误。  但是我得到过2种值，一种是255，一种是127，C标准关于 连续无符号数的操作结果赋值给无符号数，其规定是每步的结果都当无符号数处理，还是其他？[/quote] 我上面说了，s-e是得到的结果是int，这叫Integral promotions（整型提升），两个小于int范围的整数运算时均会被提升到int  也就是说s - e相当于是(int)s - (int)e，结果是int类型

user: user-0
content: 引用 5 楼 paschen 的回复:1楼说的不正确，s - e 比int小，s - e后的结果不是unsigned char类型，而是int类型，即int类型的-1，再转换成unsigned，即0xFFFFFFFF，十进制是4294967295  所以最后结果相当于是4294967295 % 128 = 127 版主，所有变量都当unsigned char就是int 是手误。  但是我得到过2种值，一种是255，一种是127，C标准关于 连续无符号数的操作结果赋值给无符号数，其规定是每步的结果都当无符号数处理，还是其他？

user: user-0
content: 引用 2 楼 hzy_76 的回复:負數取模可能實現不同？學習了！ 在某平台下： unsigned char len = 128; unsigned char s = 0； unsigned char e = 1； unsigned a = (s-e)%len; unsigned b = s-e; unsigned c = b%len;  结果是a=255；c是127 去看对应的汇编的时候，a在s-e这步完成后没有无符号处理的指令，然后直接就接着%了，b则是在减完后紧跟着了一个无符号处理的指令。 按理说a的逻辑应该是 减后无符号处理，然后%。

user: user-1
content: 1楼说的不正确，s - e 比int小，s - e后的结果不是unsigned char类型，而是int类型，即int类型的-1，再转换成unsigned，即0xFFFFFFFF，十进制是4294967295  所以最后结果相当于是4294967295 % 128 = 127

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:这个问题跟%应该没啥关系。主要是类型有关，尤其类型的隐氏提升。 s - e两个都是unsigned char类型，计算出来的结果是-1，转unsigned char得：255；然后%len，由于len是unsigned int类型，因此255再转换位unsigned int类型，最后与len计算%. 所以结果应该是255 % 128  按理说 一群无符号数的连续的操作，都应当做无符号数来做处理。 我在windows上得到的值是127，在其他平台上得到过255，没想明白，C标准中对于 无符号连续运算的规定我记得是  每步的结构都当成无符号数参与下一步运算。

user: user-2
content: 这个问题跟%应该没啥关系。主要是类型有关，尤其类型的隐氏提升。 s - e两个都是unsigned char类型，计算出来的结果是-1，转unsigned char得：255；然后%len，由于len是unsigned int类型，因此255再转换位unsigned int类型，最后与len计算%. 所以结果应该是255 % 128

user: user-3
content: 負數取模可能實現不同？學習了！

user: user-4
content: 那虚数取模呢？

user: user-5
content: 用事实说话,XXXX
user-0 提问: VS2013链表冒泡排序运行报错Free Heap block 3e71c8 modified at 3e71e0 after it was freed怎么办

回复:
user: user-1
content: return 0之前加一句getchar()就可以實現任意鍵退出。

user: user-0
content: 引用 1 楼 hzy_76 的回复:那一句應該寫為：   struct NODE * head = (struct NODE *)malloc(sizeof(struct NODE));   因爲malloc的參數是大小，如果帶了*號，則不是結構体所佔空間大小，而是指針所佔空間大小。 谢谢,可以了,还有最后它生产的程序,执行完直接关闭了,如何才能是它长时间显示

user: user-1
content: 那一句應該寫為：   struct NODE * head = (struct NODE *)malloc(sizeof(struct NODE));   因爲malloc的參數是大小，如果帶了*號，則不是結構体所佔空間大小，而是指針所佔空間大小。
user-0 提问: 为什么运行正确但是oj平台不给过嘞！！？？

回复:
user: user-1
content: 边界条件 输入输出格式 ……

user: user-2
content: 整数的范围没有规定，建议用数组存

user: user-3
content: #include<stdio.h> #include <stdlib.h> #include<math.h>  const char *digits[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve"};  int main() {     int n, t, cnt;     int i;     int digit_list[12];      while(scanf("%d",&n)!=EOF)     {         if(n < 0)             t = abs(n);         else             t = n;          if (n == 0) {             printf("0 has %s number, is 0\n", digits[n+1]);             continue;         }          cnt = 0;         while (t) {             digit_list[cnt++] = t % 10;             t /= 10;         }          i = 0;         printf("%d has %s %s ", n, digits[cnt], cnt > 1 ? "numbers, are":"number, is");         while (i < cnt - 1) {             printf("%d,", digit_list[i]);             i++;         }         printf("%d\n", digit_list[i]);         /*         count = 0;         while(t)         {             t/=10;             count++;         }         printf("%d have %d numbers,are ",n,count);          for(i=0;i<count;i++)         {             a=n1%10;             n1=n1/10;             if(i<count-1)                 printf("%d,",a);             if(i==count-1)                 printf("%d\n",a);         }         */     }      return 0; } 参考一下吧

user: user-0
content: 引用 2 楼 mxway 的回复:输入测试用例如下： 99999999999999999999999999999999999999999999999999999999999999 0123456 看下你的结果还对不？ 012345这个不是个整数吧·······还有这个巨大的999··怎么处理啊请问！··

user: user-0
content: 引用 1 楼 hdt 的回复:是one不是1 那这个咋处理呢，总不能列举吧·····

user: user-4
content: 输入测试用例如下： 99999999999999999999999999999999999999999999999999999999999999 0123456 看下你的结果还对不？

user: user-5
content: 是one不是1
user-0 提问: 刚了解到栈 不知道咋做 有点懵

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-1
content: 百度搜相关关键字。

user: user-0
content: 大佬还是帮我写一个吧 我研究下

user: user-2
content: 以下的定義要改成char型  int contents[STACK_SIZE];//定义数组用作栈  然後push和pop的相關參數也要改成char，其餘按提示做就好
user-0 提问: 键盘模拟程序不行

回复:
user: user-1
content: 从哪里看出不行的，你这是实现“徽标”+E，是打开我的电脑，vc6+xp下测试通过

user: user-2
content: https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms646304(v=vs.85).aspx

user: user-0
content: 多谢，就是因为没关360

user: user-3
content: 引用 5 楼 wenyuqilin 的回复:我的是WIN7，自己按windows+e可以实现打开的，但是这个程序就不行 关闭UAC、防火墙、杀毒软件、…… 重启电脑 ……

user: user-0
content: 我的是WIN7，自己按windows+e可以实现打开的，但是这个程序就不行

user: user-4
content: void SendKey(char Key) {   keybd_event(Key, MapVirtualKey(Key, 0), KEYEVENTF_EXTENDEDKEY, 0);   keybd_event(Key, MapVirtualKey(Key, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); }

user: user-3
content: 百度搜“SendInput”
user-0 提问: 内核USB跑着跑着就挂了

回复:
user: user-1
content: http://blog.csdn.net/zhao4zhong1/article/details/53078924 老司机找bug的十年心路历程

user: user-2
content: 两点小建议： 1. 增加问题复现场景描述 2. 检查硬件连接状态 3. 检查usb设备节点是否还存在
user-0 提问: c语言中 scanf的疑问

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-2
content: 只要不是解引用、加减，不会有什么严重后果的。不过最好不要靠运气编程

user: user-3
content: 引用 3 楼 a34140974 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 加上&的操作是有问题的。之所以编译没问题，是因为scanf("%s", 地址）；cChar和&nChar都是地址值，因此编译没问题。 但是运行就会有问题。因为&nChar和nChar还是有区别的。nChar是10个char空间的首地址。而&nChar是首地址的地址。 [/quote] 地址是一样的，但是类型不一样。nChar的类型和&nChar的类型不一样。&nChar的类型是char (*)[10];

user: user-4
content: 引用 楼主 qq_36744540 的回复:求解！！！ char cChar[10]; scanf("%s",cChar); 这行能理解，数组名代表数组的首地址，可是为什么把上面第二行改成scanf("%s",&cChar);加个取地址符号编译也能通过；有哪位大神能知道这是为什么吗？cChar已经代表首地址了，再加个取地址符是怎么回事？谢谢各位  编译不会有错，运行也应该没问题，但是加不加&的对于cChar来说是不同的，就像1楼所说，cChar的类型是Char*，&cChar的类型是char (*)[10]

user: user-5
content: 引用 1 楼 cfjtaishan 的回复:加上&的操作是有问题的。之所以编译没问题，是因为scanf("%s", 地址）；cChar和&nChar都是地址值，因此编译没问题。 但是运行就会有问题。因为&nChar和nChar还是有区别的。nChar是10个char空间的首地址。而&nChar是首地址的地址。

user: user-5
content: char a[10] = { 'a' }; printf("%d\n", a); printf("%d\n", &a); 输出是一样的。

user: user-3
content: 加上&的操作是有问题的。之所以编译没问题，是因为scanf("%s", 地址）；cChar和&nChar都是地址值，因此编译没问题。 但是运行就会有问题。因为&nChar和nChar还是有区别的。nChar是10个char空间的首地址。而&nChar是首地址的地址。
user-0 提问: 一个C语言的题目...求解

回复:
user: user-1
content: 写成fenzi*fmg==fenmu*fzs

user: user-1
content: 实数不能用==判断

user: user-2
content: 兄弟，为啥我感觉你这题目就错啊？我写出来啥也没有啊 #include <stdio.h> int main(void) {     int fenzi,fenmu,fzs,fzg,fms,fmg;     for(fenzi=10;fenzi<100;fenzi++)         for(fenmu=10;fenmu<100;fenmu++)         {             fzs = fenzi/10;             fzg = fenzi%10;             fms = fenmu/10;             fmg = fenmu%10; 			 			if((fmg==0)||(fenzi>=fenmu)) 				continue; 			if((fzg==fms)&&(fenzi/fenmu==fzs/fmg)&&(fenzi%fenmu==fzs%fmg)) 				printf("%d/%d\t",fenzi,fenmu);         }       return 0； }

user: user-3
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-4
content: fenzi/fenmu == fzs/fmg需要考虑是小数的部分，实数的判断相等不能直接比较。

user: user-0
content: 引用 4 楼 wldrzx的回复:(fenzi/fenmu == fzs/fmg)转化一下  (float)fenzi/fenmu == (float)fzs/fmg 懂了，谢谢！！！精确度有问题！

user: user-5
content: (fenzi/fenmu == fzs/fmg)转化一下  (float)fenzi/fenmu == (float)fzs/fmg

user: user-5
content: 在 if((fzg==fms) && (fenzi/fenmu == fzs/fmg))上面加if（fmg！=0） 而且你这个程序应该会有丶问题。精确度的问题。

user: user-0
content: 引用 1 楼 user-6的回复:if((fzg==fms) && (fenzi/fenmu == fzs/fmg))这句话里面，需要判断fmg是否为0 加了个fmg!=0还是运行不出来

user: user-6
content: if((fzg==fms) && (fenzi/fenmu == fzs/fmg))这句话里面，需要判断fmg是否为0
user-0 提问: 求助，程序编译通过，组建时报错，这是为什么

回复:
user: user-0
content: 引用 1 楼 user-3 的回复:mian ?  想撞墙。。。。。犯这么低级的错误，老哥眼睛真毒，佩服啊

user: user-1
content: int mian(void)   改成：  int main(void)  注意拼写~

user: user-2
content: mian 修改为 main

user: user-3
content: mian ?
user-0 提问: 【求助】循环完成5局，使用break实现中途退出游戏

回复:
user: user-1
content: for ( i = 0; i < 5; i ++) {     if ( flag == 'n' )          break;   还有，你的第二个scanf里，%c前是不是多打了一个空格？

user: user-2
content: 引用 2 楼 qq_29600891 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 可以直接在for循环外判断i是否为5，若为5则玩完5局，可能会晋级。再循环中判断grade的值，计算>=80分的次数，最后确定是否晋级。 那实现中间不选择玩下去，跳出循环怎么写？ [/quote] 判断一下不想玩下去的条件，然后Break出来就好了

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:可以直接在for循环外判断i是否为5，若为5则玩完5局，可能会晋级。再循环中判断grade的值，计算>=80分的次数，最后确定是否晋级。 那实现中间不选择玩下去，跳出循环怎么写？

user: user-2
content: 可以直接在for循环外判断i是否为5，若为5则玩完5局，可能会晋级。再循环中判断grade的值，计算>=80分的次数，最后确定是否晋级。
user-0 提问: memset 报错， Bus error: 10

回复:
user: user-1
content: 引用 10 楼 wllabs 的回复:[quote=引用 9 楼 zhao4zhong1 的回复:] 刚用VS2010亲测#8代码无错。  要用gcc啊。 还是不行，貌似真要malloc下。[/quote] gcc/g++或ld也应该有类似编译选项。

user: user-1
content: 刚用VS2010亲测#8代码无错。

user: user-1
content: VC6下，亲调无错： #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！ #include <stdio.h> #include <stdlib.h> #include <string.h>  struct _ts {     unsigned int a;     unsigned int b;     unsigned int c;     int d;     char *content; };  typedef struct _ts ts; typedef ts *tsptr;  int main(int argc, char *argv[]) {    ts t = {0, 0, 0, 0, NULL};    t.content = "this is str";    memset(t.content, 0, 6);    memset(&t.content[0], 0, 6);    printf("%s\n", t.content);    return 0; }

user: user-2
content: t.content = "this is str"  这里t.content指向的是字符串常量，修改字符串常量时出错

user: user-3
content: t.conent = (char*)malloc(sizeof(char)*strlen("this is str")+1) memset...

user: user-4
content: 引用 2 楼 wllabs 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] memset(&t.content[0], 0, 6); 这句有问题。因为t.content是指向只读数据段的，因此不能修改。现在用memset要把"this is str"修改（修改为0），是会出现错误。  在这里  就报错了，我不明白，我memset都出错了。求解决办法。   memset(t.content, 0, 6); [/quote] 需要分析memset是做什么，它是将某个地址开始的内存空间赋值一个值，memset(t.content, 0, 6);就是将t.content开始的6个字节的内存空间赋值0.既然是赋值，那么肯定是修改了t.content开始6个字节的内存空间。但是t.content指向的内存空间是只读的，因此会出现错误。 解决办法是，t.content = NULL;

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

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！   还是不行，程序还是报错。

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:memset(&t.content[0], 0, 6); 这句有问题。因为t.content是指向只读数据段的，因此不能修改。现在用memset要把"this is str"修改（修改为0），是会出现错误。  在这里  就报错了，我不明白，我memset都出错了。求解决办法。   memset(t.content, 0, 6);

user: user-4
content: memset(&t.content[0], 0, 6); 这句有问题。因为t.content是指向只读数据段的，因此不能修改。现在用memset要把"this is str"修改（修改为0），是会出现错误。

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:刚用VS2010亲测#8代码无错。  要用gcc啊。 还是不行，貌似真要malloc下。
user-0 提问: windows驱动编程，IRP_MJ_CREATE控制U盘读取后无法弹出U盘！

回复:
user: user-1
content: FltReleaseContext();检查一下打开的设备是否关闭了

user: user-2
content: 这个网站上难道没有问答论坛吗？

user: user-0
content: up  实在是小白，看了一些资料也没能解决。。

user: user-2
content: Windows驱动开发 http://www.osronline.com/
user-0 提问: 为什么在结构体中打印结构体的地址没有显示

回复:
user: user-1
content: 不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。

user: user-2
content: 引用 2 楼 Cocoyejintianming 的回复:谢……谢谢哈我也才反应过来没少，我个傻子  能不能再问一下为什么char name[9]数组的字节数为什么不是9哇？37到40是怎么来的？  地址用的16进制表示， 0x40 = 64 ， 0x37 = 55.  0x40-0x37 = 64 -55 = 9;  没问题哈。

user: user-0
content: 引用 9 楼 bj大白菜的回复:你前面几个printf打印的不是地址哦 啊咧?字符数组不是用数组名打印咩？

user: user-0
content: 引用 7 楼 赵4老师的回复:[quote=引用 6 楼 Cocoyejintianming 的回复:] [quote=引用 5 楼 user-6的回复:]没少啊，我ide没问题 不好意思，我数错了[/quote] 谁都有瞬间脑子短路的时候。[/quote] Σ(ﾟ∀ﾟﾉ)ﾉ谢谢老师理解

user: user-0
content: 引用 11 楼 Cocowangkeke的回复:[quote=引用 9 楼 bj大白菜的回复:]你前面几个printf打印的不是地址哦 啊咧?字符数组不是用数组名打印咩？[/quote] emmm我指的是打印地址

user: user-1
content: 引用 6 楼 Cocoyejintianming 的回复:[quote=引用 5 楼 user-6的回复:]没少啊，我ide没问题 不好意思，我数错了[/quote] 谁都有瞬间脑子短路的时候。

user: user-3
content: 你前面几个printf打印的不是地址哦

user: user-4
content: 引用 2 楼 Cocoyejintianming 的回复:谢……谢谢哈我也才反应过来没少，我个傻子  能不能再问一下为什么char name[9]数组的字节数为什么不是9哇？37到40是怎么来的？ 16进制的37和40之间相差的就是9.。。。

user: user-0
content: 谢……谢谢哈我也才反应过来没少，我个傻子  能不能再问一下为什么char name[9]数组的字节数为什么不是9哇？37到40是怎么来的？

user: user-5
content: 额，你数一下有几个printf，然后有几行的输出。  如果不好判断，建议在输出birthday打印里加个记号。比如加一些****或+++

user: user-0
content: 引用 5 楼 user-6的回复:没少啊，我ide没问题 不好意思，我数错了

user: user-6
content: 没少啊，我ide没问题

user: user-0
content: 谢谢老师

user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组
user-0 提问: C语言oj题，关于字符串中的数字怎么相加的问题，求指教！

回复:
user: user-1
content: 先把字符串转成整数，用atoi，然后直接相加就行，最后输出  后面加上一条语句：printf("%d", atoi(s) + atoi(t));
user-0 提问: 程序没有错，但是运行出错。

回复:
user: user-1
content: 一元二次方程是二次函數與x軸的交點，當判別式b*b-4a*c小於零時，此抛物綫與x軸無交點，換句話説此時方程無解。 所以你應該先判斷b*b-4a*c的值，如果小於零，輸出“方程無解”，大於或等於0時才求解。

user: user-2
content: d = sqrt(fabs(b*b - 4 * a * c)); 取绝对值。注意加上头文件<math.h>

user: user-3
content: 你的b*b-4a*c小于零，结果肯定不对啊
user-0 提问: 为什么我运行的时候多了一个问号

回复:
user: user-0
content: 引用 3 楼 user-1 的回复:你CreateList_L函数中，(*L) = (LinkList)malloc(sizeof(LNode));这个结点对应的data没有初始，你可以加上(*L)->data = '\0'; 或者输出时从第2个节点开始输出 版主大佬，你回答问题真快。 感谢你的回答，代码已经修改能正常运行了

user: user-1
content: 你CreateList_L函数中，(*L) = (LinkList)malloc(sizeof(LNode));这个结点对应的data没有初始，你可以加上(*L)->data = '\0'; 或者输出时从第2个节点开始输出

user: user-0
content: 运行结果如图

user: user-0
content: 还有一个问题是，这个插入元素的函数。在i=1时会不会有问题
user-0 提问: [c语言] 跪求大佬帮忙分析代码

回复:
user: user-1
content: void f(struct node a,struct node b) 你想在这个函数中改变a的内容，参数应该是地址才是，写成 void f(struct node *pa,struct node b) 后面函数体中，以及mian中的调用部分做相应修改，再试试
user-0 提问: 关于C语言二重动态数组的问题。

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-2
content: 代码建议多加注释, 方便查看.   有疑问的地方, 就将 存疑的变量打印出来, 观察变量的值.

user: user-3
content: #include <stdio.h> #include <stdlib.h>  int main() {     int **a,n,m,i,j;     n=2;     m=3;     a = (int **)malloc(sizeof(int*)*n);     if (!a)         exit(0);     for(i=0;i<n;i++)     {         a[i]=(int *)malloc(sizeof(int)*m);         if (!a[i])             exit(0);     }     for(i=0;i<n;i++)     {         for(j=0;j<m;j++)         {             a[i][j] = i+j;         }     }      printf("finished");      for(i=0;i<n;i++)     {         //for(j=0;i<m;j++)         for(j=0;j<m;j++)         {             printf("%d\n",a[i][j]);         }     }     for(i=0;i<n;i++)     {         free(a[i]);     }     free(a);     return 0; } 参考一下吧 注意注释掉的部分和新的部分的区别。循环判断条件i < m；应该改成j < m；
user-0 提问: 关于运算符号的问题

回复:
user: user-1
content: 通常 先算ch/i,接着在算f*d,然后才是ch/i+f*d，然后才是f+i  为什么是通常，因为编译器优化时可以随心所欲，甚至如果有能在编译期就计算出的编译期就给你计算出了，伦不到运行期计算，更谈不上顺序了

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-2
content: 理解和讨论之前请先学会如何观察！

user: user-3
content: ch/i、f*d、f+i，先算哪个都对，看编译器高兴哪个了。如果由于顺序改变导致结果不同，那么这个表达式就是有问题的，UB问题

user: user-4
content: ch/i+f*d-(f+i); 乘除与加减，先算乘除：这个规则应该没有异议的。 右括号先算括号里的，这个也是没问题的。但是右括号的在最后。 计算方法是从坐向右：先算ch / i，然后计算f * d，在然手f + i。然后再从左向右依次计算加减。

user: user-2
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
user-0 提问: 求助，帮我看看这个程序

回复:
user: user-0
content: 引用 1 楼 cfjtaishan 的回复:这个很正常，第一个程序，是调用2次，第二次的赋值49覆盖了第一次调用赋值的73。 第二个程序，虽然也调用了2次，但是在第一次调用之后就马上输出，此时还没被新的值覆盖。  总之原因，通过输出的地址，我们可以发现2次操作是对于同一内存区域赋值。因此，只要不被覆盖，就会打印之前，否则就会输出最新的。 可以这么理解，arr认为是一个容器，第一个程序是先往容器里放73值，紧接着再放49值，因此输出的肯定是49，因为第二次覆盖了73. 第二个程序，先往容器里放73，然后输出，那么输出的是73，此时再往里放49，则输出的是49.   谢谢，这下弄明白了

user: user-0
content: 引用 2 楼 shiyanbo_1006 的回复:核心在于int*指针始终指向的都是static int arr[6]这块公共地址，理解了这个，对于输出你也就没有疑问了 在提点建议，为什么要起int * vector这么个名字，开始我还以为是在对vector操作呢  这个是书上的一个例程，照着敲的哈哈，谢谢解答！！！！

user: user-0
content: 引用 3 楼 paschen 的回复:虽然vector与vector2是两个指针，但它们指向的内存都是同一块（因为是static变量），第一个程序int * vector2= arrallocate(6,49);执行 修改了内存中的数据，输出vector时也是输出修改后的（因为它们都指向同一块内存）；第二个程序输出vector时数组中的值还没有被vector2改变   这么一说我就明白了，看来还是我自己对于static的理解不深，感谢解答！！！

user: user-1
content: 虽然vector与vector2是两个指针，但它们指向的内存都是同一块（因为是static变量），第一个程序int * vector2= arrallocate(6,49);执行 修改了内存中的数据，输出vector时也是输出修改后的（因为它们都指向同一块内存）；第二个程序输出vector时数组中的值还没有被vector2改变

user: user-2
content: 核心在于int*指针始终指向的都是static int arr[6]这块公共地址，理解了这个，对于输出你也就没有疑问了 在提点建议，为什么要起int * vector这么个名字，开始我还以为是在对vector操作呢

user: user-3
content: 这个很正常，第一个程序，是调用2次，第二次的赋值49覆盖了第一次调用赋值的73。 第二个程序，虽然也调用了2次，但是在第一次调用之后就马上输出，此时还没被新的值覆盖。  总之原因，通过输出的地址，我们可以发现2次操作是对于同一内存区域赋值。因此，只要不被覆盖，就会打印之前，否则就会输出最新的。 可以这么理解，arr认为是一个容器，第一个程序是先往容器里放73值，紧接着再放49值，因此输出的肯定是49，因为第二次覆盖了73. 第二个程序，先往容器里放73，然后输出，那么输出的是73，此时再往里放49，则输出的是49.
user-0 提问: 菜鸟请教c primer plus示例程序问题。

回复:
user: user-0
content: 引用 1 楼 jianwen0529 的回复:这两个关键字含义就不一样：continue是跳过本次循环进行下一次循环，break是直接中断（跳出）最内层循环，不会再次进行循环！ 相同的是这两个都是仅仅对最近的循环有效  41 42行是要跳过一行剩余字母，用break直接直接跳出不是更好吗？

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 有两个continue，你要将那个continue换成break还是将两个都换成break; 将第一个continue换成break后会增加一个退出while循环的出口，遇到‘\n'就会退出循环。 而第二个continue是子循环中，换成break只是跳出自循环，而不能跳出外循环。

user: user-3
content: 这两个关键字含义就不一样：continue是跳过本次循环进行下一次循环，break是直接中断（跳出）最内层循环，不会再次进行循环！ 相同的是这两个都是仅仅对最近的循环有效

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 谢谢！  41 42行是丢弃一行中其它字符，continue会跳转到关系表达式继续比较，用break直接 跳出当前循环不是更好吗？

user: user-3
content: 引用 4 楼 Monchhichi_2018 的回复:[quote=引用 1 楼 jianwen0529 的回复:] 这两个关键字含义就不一样：continue是跳过本次循环进行下一次循环，break是直接中断（跳出）最内层循环，不会再次进行循环！ 相同的是这两个都是仅仅对最近的循环有效  41 42行是要跳过一行剩余字母，用break直接直接跳出不是更好吗？[/quote] break只能跳出内层while，外层的while还会继续执行，那么作为#进行结束判断就失效了。 因为这个程序是持续性的，可以连续判断多个以#结束的串（多次输入）  其实你只要编译运行下就知道怎么回事了！
user-0 提问: 怎么给0x40020000地址的值初始化？

回复:
user: user-1
content: 是裸机程序还是Linux？是gpio的设置寄存器吗？Linux要ioremap的，不可能直接访问物理地址

user: user-2
content: Windows下使用WinIO.sys

user: user-0
content: GPIOA->MODER=1；这种方法赋值不行。出现错误，0xC0000005: 写入位置 0x40020000 时发生访问冲突

user: user-3
content: 比如： GPIOA->MODER = 1;  前提你要保证0x40020000是块合法有效的内存

user: user-4
content: GPIOA->MODER = xxx; //你需要的值
user-0 提问: 请问各位高手这代码哪里错了，急，谢谢

回复:
user: user-1
content: #include <stdio.h>  void afunctionoflongname(int x) { 	printf("%d\n",x); }  int main() { 	int a=1,b=2,c=3;  	void (*pt)(int); 	pt=afunctionoflongname; 	pt(a); 	pt(b); 	pt(c);  	return 0; }  参考一下吧  考虑afunctionoflongname函数没有返回值，建议将其返回值定义为void类型。另外，pt（函数指针）在指向afunctionoflongname函数时，需要去掉后面的一对小括号。因为函数名本身就是地址，它是函数栈开始的位置。

user: user-2
content: 主函数中pt = afunctionoflongname(); 改成 pt = afunctionoflongname;  void(*pt)(int); 改成 int(*pt)(int);  因为你要指向的函数的返回值是int类型的   #include <stdio.h> int afunctionoflongname(int x) { 	printf("%d\n", x); } int main() { 	int a = 1, b = 2, c = 3; 	int(*pt)(int); 	pt = afunctionoflongname; 	pt(a); 	pt(b); 	pt(c); }
user-0 提问: 请问这代码哪里错了,急，谢谢

回复:
user: user-0
content: error C2660: 'findmaxscore' : function does not take 0 parameters

user: user-1
content: #include <stdio.h>  #define N 5  int findmaxscore(int score[N], int n) { 	int i,max;  	max=score[0]; 	for (i=1;i < n;i++) 	{ 		//if(score[i]<score[i+1])    //i+1可能会导致数组元素越界或者遍历未使用的元素 		if(max < score[i]) 		{ 			max = score[i]; 		} 	} 	printf("maxscore=%d\n",max); }  int findmaxhaoma(int haoma[N], int n) { 	int i,max; 	max=haoma[0]; 	for (i=1;i<n;i++) 	{ 		//if(haoma[i]<haoma[i+1])//i+1可能会导致数组元素越界或者遍历未使用的元素 		if(max < haoma[i]) 		{ 			max = haoma[i]; 		} 	} 	printf("maxhaoma=%d\n",max); } int main() { 	int n,i, maxscore,score[N], haoma[N]; 	//long haoma[N], maxhaoma; 	printf("how many students\n"); 	scanf("%d",&n); 	for (i=0;i<n && i < N;i++)    //加上i < N防止越界 	{ 		printf("input every student's haoma and score"); 		scanf("%ld,%d",&haoma[i],&score[i]); 	} 	findmaxscore(score, n); 	findmaxhaoma(haoma, n);  	return 0; } 参考一下吧 自定义函数findmaxhaoma和findmaxscore建议定义成2个参数。否则若n输入的是3，则在这两个函数里会遍历到未使用的元素，即下表是3和4 另外，若函数不想定义为有返回值的，建议直接定义为void类型。

user: user-2
content: 其次还有一个小问题，你的两个find...函数没有返回一个值，可以最后加上return max;

user: user-2
content: 你主函数里定义了两个haoma变量，可这样改：    int main() { 	int n, i, haoma[N], maxscore, score[N]; 	printf("how many students\n"); 	scanf("%d", &n); 	for (i = 0; i < n; i++) 	{ 		printf("input every student's haoma and score"); 		scanf("%ld,%d", &haoma[i], &score[i]); 	} 	findmaxscore(score); 	findmaxhaoma(haoma); }
user-0 提问: 请问：有什么好的办法，写if语句分支语句

回复:
user: user-1
content: 看不过来就是代码太长。  了解一下 表驱动法。那么多if 很可能适合表驱动。  另外就是楼上说过的、封装函数。代码控制在100行以内就可以了

user: user-2
content: 如果你多个分支语句都会用到相近的功能，你可以做个接口，如果代码行色各异，建议注意缩进，注意命名，做好注释，是否需要用‘return’返回，不建议为每个分支写单独的函数，方便以后的维护，只要有良好的编码风格，百八十行是在一个if里也没啥。

user: user-3
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George  前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题；他觉得前同事们应该用这些问题来问自己；实际上不管在哪里工作的开发者们都应该经常问问自己这些问题： ◆“要保证这个问题不会再出现，我该怎么做？” ◆“要想少出些Bug，我该怎么做？” ◆“要保证Bug容易被修复，我该怎么做？” ◆“要保持对变化的快速响应，我该怎么做？” ◆“要保证我的软件的运行速度，我该怎么做？” 如果大多数团队都能不时问一下自己，必定会从中得益，因为这些都是真正强而有力的问题。

user: user-4
content: 看到大量的if else 容易想到 switch case  看到大量的switch case 容易想到 多态

user: user-5
content: {     if(1)     {     (1)     (2)     return  xx     }     (3)     (4)     ...     (50)     return xx }

user: user-5
content: 若在一个函数体内只有两种情况，建议设置成这样： if(1) {     (1)     (2)     return  xx     }     (3)     (4)     ...     (50)     return xx } 若函数定义的是void，那么直接return;，若有返回值则返回对应的。

user: user-6
content: 有缩进的话再加上注释还是比较清晰的，当然你也可以将if后的条件改成反命题，然后把原if块和else块的内容互换

user: user-7
content: 定义新的函数，不要让每个函数代码太长

user: user-8
content: 讲个最简单的方式，那你把那些分支语句封装成几个函数写，然后在else语句中调用，加上几个备注，这样看起来不就清楚了嘛

user: user-9
content: 引用 2 楼 leetow2006 的回复:if(1) ... retrun; ====================== 返回？这样可以吗？但是感觉这样写程序不规范 当然可以返回，不过这里的return应该是包含在if的大括号里面的。 一百行内数量的代码在一个函数里面很正常的，如果你有能力也可以重构成多个小函数，但是概念上最好要能支撑代码逻辑的分割。 不要为了分而分，而是为了提高重用性和维护性进行的分割。

user: user-0
content: if(1) ... retrun; ====================== 返回？这样可以吗？但是感觉这样写程序不规范

user: user-9
content: if(1) ... retrun;  ... ...  或者： 把else里面的分解成小函数，如果逻辑和概念上成立的话
user-0 提问: 请求c语言大佬教授知识，如何自定义函数求圆面积

回复:
user: user-1
content: double era（int r) {     return  3.14*r*r; }

user: user-2
content: #define PI 3.1415926 double get_area(int r) {     return PI * r * r; }

user: user-3
content: 补基础知识！

user: user-2
content: 引用 3 楼 cfjtaishan 的回复: #define PI 3.1415926 double get_area(int r) {     return PI * r * r; }  #define PI 3.1415926 double get_area(float r) {     return PI * r * r; }
user-0 提问: 划横线的在这有什么用 啊。。

回复:
user: user-1
content: typedef是定义别名。即MyType是struct tag的别名，而MyPtr是struct tag *的别名。

user: user-2
content: typedef typedef type-declaration synonym;  The typedef keyword defines a synonym for the specified type-declaration. The identifier in the type-declaration becomes another name for the type, instead of naming an instance of the type. You cannot use the typedef specifier inside a function definition.  A typedef declaration introduces a name that, within its scope, becomes a synonym for the type given by the decl-specifiers portion of the declaration. In contrast to the class, struct, union, and enum declarations, typedef declarations do not introduce new types — they introduce new names for existing types.  Example  // Example of the typedef keyword typedef unsigned long ulong;  ulong ul;     // Equivalent to "unsigned long ul;"  typedef struct mystructtag {    int   i;    float f;    char  c; } mystruct;  mystruct ms;   // Equivalent to "struct mystructtag ms;"  typedef int (*funcptr)();  // funcptr is synonym for "pointer                            //    to function returning int"  funcptr table[10];   // Equivalent to "int (*table[10])();"

user: user-3
content: 定义别名：即MyPtr 是类型 tag* 的别名
user-0 提问: ReadFile异常0xC0000005

回复:
user: user-1
content: 大问题没有，就是没有释放内存。不过代码太啰嗦了，合并成一个不就完了。还搞一个 template，但是 TYPE 还要强行转成 int * 是何道理？bool readString(HANDLE hPipe, string &str) { 	DWORD dwBytesRead; 	DWORD dwLength = 0; 	DWORD dwBuffer = sizeof(dwLength); 	BOOL bResult = ReadFile(hPipe, (void *)&dwLength, dwBuffer, &dwBytesRead, NULL); 	if (bResult && dwLength > 0) 	{ 		char *psz = new char[dwLength + 1]; 		bResult = ReadFile(hPipe, (void *)psz, dwLength, &dwBytesRead, NULL); 		str = string(psz); 		delete[] psz; 	} 	return bResult; }

user: user-2
content: new之后没有对其释放空间吧（delete) 尤其是在大量读的情况下，很有可能导致堆上的空间申请枯竭，导致new申请失败。建议根据需要是否在不需要的时候将new的空间释放掉（delete）

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

user: user-4
content: 出错时中断下来分析原因，检查内存有没申请成功，size的值是否正常之类

user: user-4
content: bool ret=read(hPipe,(int &)size);建议改成：bool ret=read(hPipe,size);，检查read函数里检查读到的值等是否有问题

user: user-0
content: 引用 1 楼 user-4 的回复:出错时中断下来分析原因，检查内存有没申请成功，size的值是否正常之类  bool ret=read(hPipe,(int &)size);   这行size不正常 c=new char[size+1];    //这里报错0xC0000005   导致这行不正常  但是问题是，大部分情况下都是正常的

user: user-0
content: 引用 1 楼 user-4 的回复:出错时中断下来分析原因，检查内存有没申请成功，size的值是否正常之类 size不正常，但是该怎么解决呢朋友，因为我主要是用C#编程，也是偶尔用c，所以比较糊涂
user-0 提问: 请问输入两个字符串，找到相同的字符并输出，不能重复输出？

回复:
user: user-1
content: 这个简单嘛，两个数组st1和str2,两个指针 p1 p2 一个计数器。p1指向str1[0],p2指向st2[0]。p2指向str2[0],时指针p1遍历str1中的所有字符，若有相同的，则p1 p2与计数器同时+1，再次判断两个指针指向的字符是否相同，若还是相同p1 p2和计数器+1；遇到不同字符的时候利用计数器把改字符输出，这样循环直到遍历完str1中的所有字符，此时p2指向str2[1],而p1则是继续指向str1的开头str1[0]，往复循环·········大概意思就是这样，代码怎么实现就看楼主自己了。

user: user-2
content: 因为你改变了指针的指向，所以不能重复输出。你应该每次定义一个临时指针变量指向这两个字符串，然后用这两个临时指针变量偏移。

user: user-3
content: 用 int 的高低位分别统计字母在两个字符串中的数量：#include <stdio.h>  void fuck(const char *s1, const char *s2) {         int count[0x7f] = { 0 };         unsigned int mask1 = 0x0000ffff;         unsigned int mask2 = 0xffff0000;         while (*s1) {                 char c = *s1++;                 int n = count[c];                 count[c] = (n & mask2) | ((n & mask1) + 1);          }         while (*s2) {                 char c = *s2++;                 int n = count[c];                 count[c] = (((n >> 16) + 1) << 16) | (n & mask1);         }         int length = sizeof(count) / sizeof(*count);         for (int i = 0; i < length; i++) {                 int cnt = count[i];                 if ((cnt & mask1) && (cnt & mask2)) {                         printf("%c\n", i);                  }         } }  int main() {         fuck("abcddeeff", "defghi");         return 0; }

user: user-0
content: 引用 2 楼 finalcsdn 的回复:假如全是小写英文字母，那么就可以开两个26的数组，a～z对应0～26，两个字符串中出现过的字符就把对应的位置设置为1，没有出现过得就是0。这样输入结束后，输出两个数组中都是1的位置对应的字符就行了。不是小写英文字母也可以实现的，只需要把数组开大一点然后还是按ASCII码映射 我正好看到一个这样写的，还是都是小写字母方便，如果算上数字和大写字母，映射起来不太得劲

user: user-0
content: 引用 1 楼 qq_40698466 的回复:可以直接在二重循环里进行判断然后直接输出，不需要再定义一个字符数组 就是在里面判断这个，搞不明白判断的方法

user: user-4
content: 可以直接在二重循环里进行判断然后直接输出，不需要再定义一个字符数组

user: user-5
content: 假如全是小写英文字母，那么就可以开两个26的数组，a～z对应0～26，两个字符串中出现过的字符就把对应的位置设置为1，没有出现过得就是0。这样输入结束后，输出两个数组中都是1的位置对应的字符就行了。不是小写英文字母也可以实现的，只需要把数组开大一点然后还是按ASCII码映射
user-0 提问: 大神们求助啊，菜鸟一枚，做自动量程电压表，仿真的时候数码管就是不显示数字，看不出程序哪里有问题，求助啊！

回复:
user: user-1
content: 最好不要用仿真，直接在开发板上调，连接逻辑分析仪抓信号，打开IAP执行单步调试，打断点，就知道你的寄存器状态，程序怎么跑的。

user: user-2
content: 应该是没有从0808获得数据，你单步调试看看吧

user: user-3
content: 万用表、示波器、逻辑分析仪、观音菩萨。
user-0 提问: 将数组a的字符复制到b数组中出现的问题

回复:
user: user-1
content: 在b[i] = '\0'; 处下断点，通过“监视”可以发现字符数组a和字符数组b的地址分别是0x004ffa78和0x004ffa68，如图1所示。  在“内存”中查看这两个地址的内容，如图2所示：  具体内容请参考《C++中字符数组》https://blog.csdn.net/hou09tian/article/details/79858007 希望能够帮到你

user: user-2
content: 学会使用数据断点：#include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 还有  sizeof  判断数组大小是怎样判断的  明明a的内容变了，但数组的大小并没有变化

user: user-0
content: 能有大神用图的方式表明下b怎样破坏a的值吗，谢谢 我还是想不懂是怎样的

user: user-3
content: void test() {     char a[] = "abcdefghijk";     char b[] = "zxcvbnc";     int i = 0;     for(i=0; i<strlen(b)-1; i++)     {         b[i] = a[i];     }     b[i] = '\0';     printf("%s\n",a);     printf("%s\n",b); }

user: user-4
content: strlen()函数产测字符串长度

user: user-0
content: 不是最多多覆盖一个字节吗，但为什么会整个都覆盖了    引用 2 楼 qq_38204686 的回复:数组越界了 ............  引用 1 楼 tomsoft 的回复:越界，您数一下数组b的长度，再数一下数组a的长度；及对b的赋值会破坏紧跟b后面的局部变量，具体是哪个局部变量取决于编译器

user: user-0
content: 那怎么解决？？

user: user-5
content: 数组越界了 ............

user: user-6
content: 越界，您数一下数组b的长度，再数一下数组a的长度；及对b的赋值会破坏紧跟b后面的局部变量，具体是哪个局部变量取决于编译器
user-0 提问: 不知道为什么  求大佬解答而命名、

回复:
user: user-1
content: #include "stdio.h"  #define N 3 #define M 100  int main(void) {     char sz[N][M];//二维字符数组，可以存放10个字符串      for(int i=0;i<N;i++)     {         gets(sz[i]);     }     int i,j;     //for(i=0;i<M;i++)     for(i=0;i<N;i++)     {         char *p1=sz[i];         j=0;         while(*(p1+j)!='\0')         {             if (j >= M -1)                 break;             if(*(p1+j)=='a'&&*(p1+j+1)=='n')             {                 puts(sz[i]);             }             j++;         }     }     return 0; } 参考一下吧 有两个地方会导致越界，第一个是sz[i]，下表应该是从0~N-1,而M远大于N，因此会导致越界访问。 第二个地方，若输入的字符串正好是M-1个，那么在判断'a', 'n'时也会导致越界： if(*(p1+j)=='a'&&*(p1+j+1)=='n') 因此除了改sz的下表之外，也应该加上对p1+j的保护。

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: for (i = 0; i < M; i++)   是否应改为：  for (i = 0; i < N; i++)

user: user-3
content: 越界了，sz第一维范围是0~N，但你for循环访问的范围是0~M，M比N大，所以越界了
user-0 提问: c文件指针和文件的打开与关闭

回复:
user: user-1
content: 1. 不知道你所谓的“产生关联”要多关联才算？按我的理解，(1)最低程度的关联是你只知道文件名，也就是只有一个字符串；(2)再高一点是你知道文件名，并且检查过文件是能打开的，也就是打开以后马上关闭；(3)再高一点就是打开文件。  2. 可以再赋值，因为aaa也不过是指向一个携带有一些信息的变量。如果你不关闭in，在程序运行期间in就一直是被打开、占用的，外在表现就是与in有关的内存得不到释放，其他程序也不能再修改in文件。但程序退出后in仍然会被释放。  3. aaa指向的那个携带有文件信息的变量，类型是struct FILE，里面记录有你当前的位置。每次发生读写，记录的位置都会自动变化。例如你读/写了4个字节，它就会+4。你要是想知道你现在所处的位置，可以随时调用ftell(aaa)来查看。当然你也可以调用fseek修改你的位置。

user: user-2
content: 1  做不到 fopen这个函数的作用是 创建一个FILE 并返回指向这个FILE的指针  现在不创建一个FILE 却希望有一个指针指向一个FILE 这就很不符合逻辑了 2  打开了但是不关闭 FILE占用的一些系统资源无法返回给系统  比如 文件描述符 缓冲区 重复太多可能会导致 无法打开文件 内存被大量占用 等问题  3 你打开文件的方式是 "w"  这个模式会清空文件内容 你调用fscanf 的读取不到数据的 这个问题暂略  怎么知道读取数据的位置 FILE结构体里面记录了读取数据的位置  fscanf这个会函数会修改FILE结构体的记录

user: user-3
content: 1. 兄弟，文件指针放在那里不用干嘛，那就干脆不要声明*aaa了 2. 当然可以重新赋值，重新赋值后原来的文件就没法关闭了，相当于系统资源没有释放，这样子肯定不行的 3. fscanf成功的话，返回值是>0的，这时会移动文件游标的
user-0 提问: C语言为什么编译不过关

回复:
user: user-1
content: include拼写错误，第一个printf后面没有分号，dogs没定义类型吧

user: user-2
content: 此外，要先定义dog变量

user: user-2
content: 最后那个printf的右双引号应该在逗号的前面

user: user-3
content: 这什么教程... 你打错了吧

user: user-4
content: include关键字拼写错误吧