Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: ARM裸机开发 malloc函数测试中的问题

回复:
user: user-1
content: 不建议用临时文件代替动态缓存，因为文件的读写操作相比动态内存的访问，非常非常的耗时。可以试着不在堆上申请，在栈上申请，创建一个全局的数组吧

user: user-2
content: 找到startup.s文件，把堆大小改大

user: user-3
content: 静待结果，我现在也是在学arm，估计也会有如此问题

user: user-4
content: 程序内存取决于您的系统，请检查一下您系统heap的大小，最大600实际也就2K多一些，通常应该不会有嵌入平台的物理内存有这么小，检查一下软件环境的配置（具体您的系统我不知道，看看启动代码给heap分配的大小，或lds等等）  另外，测试程序有一处可能会破坏内存的错误：for(I = 0; I < 600; I++) 应该改为for(I = 0; I < MaxNum; I++）更合适一些

user: user-5
content: 这个和单片机物理内存有关系吧。。在pc上malloc太大照样返回null

user: user-6
content: 用临时文件代替动态内存。个人建议。
user-0 提问: 关于C语言函数带结构体参数的一些疑问

回复:
user: user-1
content: 主要看你是否将通过Init修改之后的内容带到调用函数，因为参数传递是值传递，如果传InitAdc到Init函数，只能修改的是Init函数内的局部变量，不能将修改之后的值带回到调用Init的函数里，因此如果传&InitAdc就可以带回值。总之传InitAdc，那么InitAdc是传入参数，若传&InitAdc，则是传入传出参数。

user: user-2
content: 单看你这两句，Init(&InitAdc) 有些编译器会警告，有些会报错  比如int *a=&b；//int b   这句话其实是int *a；a=&b；并不是int *a；*a=&b； a是个地址  所以你现在建的InitAdc是个地址，Init(InitAdc)是对的，Init(&InitAdc)代表对地址取地址，除非你是MyTypeDef  **InitAdc；才能用Init(&InitAdc)

user: user-3
content: 从你贴的代码看，Init的入参就是MyTypeDef*这个类型 所以你传入Init的入参只能是这个类型，其他的用法都会导致编译报错

user: user-4
content: Init()函数的形参类型是MyTypeDef*，所以传别的类型的实参（例如MyTypeDef*的指针等）要报错

user: user-1
content: 引用 4 楼 qq_41985711 的回复:引用 3 楼 cfjtaishan 的回复:主要看你是否将通过Init修改之后的内容带到调用函数，因为参数传递是值传递，如果传InitAdc到Init函数，只能修改的是Init函数内的局部变量，不能将修改之后的值带回到调用Init的函数里，因此如果传&InitAdc就可以带回值。总之传InitAdc，那么InitAdc是传入参数，若传&InitAdc，则是传入传出参数。InitAdc 是一个结构体指针，已经在传地址了，而 &InitAdc 是对指针取地址即二级指针。 那要看调用函数里，是怎么定义和初始化InitAdc的。

user: user-5
content: 引用 3 楼 cfjtaishan 的回复:主要看你是否将通过Init修改之后的内容带到调用函数，因为参数传递是值传递，如果传InitAdc到Init函数，只能修改的是Init函数内的局部变量，不能将修改之后的值带回到调用Init的函数里，因此如果传&InitAdc就可以带回值。总之传InitAdc，那么InitAdc是传入参数，若传&InitAdc，则是传入传出参数。InitAdc 是一个结构体指针，已经在传地址了，而 &InitAdc 是对指针取地址即二级指针。
user-0 提问: 为什么结构体暑促数据时候要+=2 两倍往后遍历才可以

回复:
user: user-0
content: 哦，题库里最大测试数量为10^5我就开大了些，谢谢哈

user: user-1
content: temp=temp+1;等同于i++

user: user-2
content: 问题出在你的赋值for循环，又是i++，又是temp = temp + 1。。。是你自己赋值的时候，只赋值了偶数位，奇数位的你都跳过去了……还好你的member开得很大，而测试数据很小。     for (i = 0; i<member; i++)     {         scanf("%d %d %d", &temp[i].id, &temp[i].dgrade, &temp[i].cgrade);         temp[i].sum = temp[i].cgrade + temp[i].dgrade;         //printf("%d %d %d %d\n", &arr[0].id, arr[0].dgrade, arr[0].cgrade, arr[0].sum);         //temp=temp+1;//注释掉这句就ok了，不用双倍的      }
user-0 提问: 结构体数组为什么每次输出的值不一样

回复:
user: user-1
content: ArrList *arr = (ArrList*)malloc(sizeof(ArrList)*(member+100)); 这句编译的时候应该有告警吧。两种类型不一样，malloc地址不一定是连续的。

user: user-0
user-0 提问: 求解~3&(2&3^4)=4背后的原理

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-2
content: 背后的原理？这不是C语言入门前几章的东西吗，~&|^这些位运算符，发现了新大陆？

user: user-3
content: ~3&(2&3^4)=4 才看懂意思。 3:   0000  0011 ~3  1111  1100 2:   0000  0010 2&3:       0000  0010 4:   0000  0100 2&3^4:       0000  0110 ~3 & (2&3^4)       0000  0100 位运算的结果，需要一步步推敲。  再看您的代码  (635*2+k)&(~k) 1.无论第一部分 635*2 是什么，可以确定第一部分的末尾为0. 所以， (635*2+k)加起来，末尾1bit为k的末尾。～k的最低位去反后，与原来的比特取AND，横为0.所以您的结果都为偶数。 2.k 二进制数为1的比特 ～k肯定为0,因此，整个运算实际上是用  ～k 的1位做了mask。即无论 (635*2+k)算出来是啥子，都只保留k取0的那些位。  没有整体工程背景，不知道这种运算的实际意义。

user: user-3
content: 位运算，具体的意义要放到你的大工程里才知道。
user-0 提问: PTA c语言程序设计 2-18

回复:
user: user-0
content: 感谢各位的回复，我明白了，看来写码要注意的细节真是多。心里想着一切ok的代码，执行起来不知道会出什么幺蛾子。

user: user-1
content: 引用 3 楼 zangfong 的回复:后面代码main函数中的for循环，除了费时，的确没什么用。问题是出在你的double fact(int n)函数的定义。题目之所以提醒你n是int，但是函数返回类型是double的，就是说明在计算n!的过程中，int类型会溢出。试了一下，当a > 12时，阶乘的结果就溢出了。所以你需要跟参考代码一样，把你的a定义成double，才不会出现溢出的情况double fact(int n) {     double a = 1;     int i;     for(i = n; i > 1; i--)         a = a * i; } 忘了一个return a;

user: user-1
content: 后面代码main函数中的for循环，除了费时，的确没什么用。问题是出在你的double fact(int n)函数的定义。题目之所以提醒你n是int，但是函数返回类型是double的，就是说明在计算n!的过程中，int类型会溢出。试了一下，当a > 12时，阶乘的结果就溢出了。所以你需要跟参考代码一样，把你的a定义成double，才不会出现溢出的情况double fact(int n) {     double a = 1;     int i;     for(i = n; i > 1; i--)         a = a * i; }

user: user-2
content: 你可以把 double product  改成 int  试试  你for循环应该是 i>=1 吧

user: user-3
content: a的类型是double，我也没看出来为什么需要在主函数加一段循环
user-0 提问: 添加这个函数就会导致很多函数报错本地函数非法，检查括号没有问题啊

回复:
user: user-1
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-2
content: 具体什么错误呢
user-0 提问: 用未来教育的模拟考试做程序设计题老出现这个

回复:
user: user-1
content: #include <stdio.h> #include <math.h>  double  fun( int  n) {     double sum=0.0;     int i;     for(i=21; i<=n; i++)         if((i % 3==0) && (i % 7==0)) sum+=i;     return sqrt(sum) ; } void NONO (); int main()   /* 主函数 */ {     printf("s =%f\n", fun ( 1000) );     NONO(); } void NONO () {/* 本函数用于打开文件，输入数据，调用函数，输出数据，关闭文件。 */     FILE *fp, *wf ;     int i, n ;     double s;      fp = fopen("in.dat","r") ;     if (!fp) {         fprintf(stderr, "open file error!\n");         return;     }     wf = fopen("out.dat","w") ;     if (!wf) {         fprintf(stderr, "open file error!\n");         return;     }     for(i = 0 ; i < 10 ; i++) {         fscanf(fp, "%d", &n) ;         s = fun(n) ;         fprintf(wf, "%f\n", s) ;     }     fclose(fp) ;     fclose(wf) ; } 应该是文件打开失败导致的，打开失败返回的是NULL，如果再次使用NULL则会出现错误； 如上，做一下fopen的返回值判断

user: user-0
content: 怎么回事啊这是，求解答

user: user-0
content: 程序： #include <math.h> #include <stdio.h> double  fun( int  n) {   double sum=0.0;   int i;   for(i=21; i<=n; i++)     if((i % 3==0) && (i % 7==0)) sum+=i;   return sqrt(sum) ; }  main()   /* 主函数 */ {  void NONO ();    printf("s =%f\n", fun ( 1000) );    NONO(); } void NONO () {/* 本函数用于打开文件，输入数据，调用函数，输出数据，关闭文件。 */   FILE *fp, *wf ;   int i, n ;   double s;    fp = fopen("in.dat","r") ;   wf = fopen("out.dat","w") ;   for(i = 0 ; i < 10 ; i++) {     fscanf(fp, "%d", &n) ;     s = fun(n) ;     fprintf(wf, "%f\n", s) ;   }   fclose(fp) ;   fclose(wf) ; }
user-0 提问: C语言链表，同一个函数，为什么调用位置不一样，一个正常，一个就程序崩溃了呢

回复:
user: user-1
content: 自己malloc的空间，用完随手free是个好习惯 #include<stdio.h> #include<malloc.h>  typedef struct List {     int data;     struct List *next; } Sqlist;  void printList(Sqlist *list) {     while (list ->next != NULL) {         list = list -> next;         printf("%d\n", list -> data);     } }  Sqlist * createListByArray(int *a) {     Sqlist *list, *s, *t;     list = (Sqlist *)malloc(sizeof(Sqlist));     t = list;     for(int i = 0; i < 5; i++) {         s = (Sqlist *)malloc(sizeof(Sqlist));         s -> data = *(a + i);         t -> next = s;         t = s;     }     t -> next = NULL;      //位置1     printList(list);     return list; }  void deletelist(Sqlist *head) {     Sqlist *q,*p = head;     while(p != NULL)     {         q = p;         p = p->next;         free(q);         q = NULL;     } }  int main(int argc, char *argv[]) {     int a[] = {1, 2, 3, 4, 5};     Sqlist *list;      list = createListByArray(a);      //位置2     printList(list);      deletelist(list);  }

user: user-0
content: 楼上的谢谢你（没找到怎么直接回复），很抱歉早你一分钟结贴了

user: user-2
content: 位置2中，printList(list);   list并没有指向链表头，只是Sqlist *list;分配的地址。和生成链表函数中list = (Sqlist *)malloc(sizeof(Sqlist));  list的地址是不一样的，这个函数中的list才是指向链表。  #include<stdio.h> #include<malloc.h>  typedef struct List { 	int data; 	struct List *next; } Sqlist;  void printList(Sqlist *list) { 	while (list -> next != NULL) { 		list = list -> next; 		printf("%d\n", list -> data); 	} }  Sqlist * createListByArray(Sqlist *list, int *a) { 	Sqlist *s, *t; 	list = (Sqlist *)malloc(sizeof(Sqlist)); 		printf("2=%#X\n",list); 	t = list; 	for(int i = 0; i < 5; i++) { 		s = (Sqlist *)malloc(sizeof(Sqlist)); 		s -> data = *(a + i); 		t -> next = s; 		t = s; 	} 	t -> next = NULL;  	//位置1 	printList(list); 	return list; }  int main(int argc, char *argv[]) { 	int a[] = {1, 2, 3, 4, 5}; 	Sqlist *list,*h; 	printf("1=%#X\n",list); 	h=createListByArray(list, a); 		printf("3=%#X\n",h);  	//位置2 	printList(h); }   添加了3个printf函数帮助识别list的地址

user: user-0
content: 我知道了，下面是我的理解，做个笔记： 用纯C的话，malloc动态申请内存之后会返回一个指针，而形参为*p时，虽然*p的值与主函数中的*p相同，但是p的地址却不相同，因此对p的赋值（值为mallo的返回值）并没有作用到主函数p上，也就是主函数中的*p其实并没有初始化，所以可以在函数中返回*p，然后主函数中接受函数返回值来初始化主函数的*p； 而使用C++的话，则可以使用*&p，这个传递的是主函数中p的真是地址，函数中对p赋值，即为对主函数中的p赋值； 另外，形参为*&p时候，如fun（int *&p）;不知道为什么不可以直接fun（&a）;而只能int *q = &a; fun（q）;还不知道为啥

user: user-0
content: 有大佬没
user-0 提问: 求哪位帮我看看，一元多次式为什么只输出第一个啊

回复:
user: user-1
content: 引用 2 楼 qq_41985711的回复:[quote=引用 1 楼 weixin_42814069的回复:]跪求大神    啊 你的 creatList 函数里面不能实现一次输入多个节点，因为你 指针p的指向没有变，故一直都是给p指向的内存写入数据，在循环中写上这么一句  p = p->next; 删除r = p; 最后在循环外加上  p = NULL; r = p;这样可以一次给多个节点赋值，但是并不能将所有节点返回，只返回头节点，有头节点就可以循环查找。建议:creatList函数只创建一个节点。其次，你上传问题代码之后进行排版和注释方便阅读。（电脑没网络，用的手机，不能打出具体代码，请谅解）[/quote] 没看清代码，见笑了

user: user-1
content: 引用 1 楼 weixin_42814069的回复:跪求大神    啊 你的 creatList 函数里面不能实现一次输入多个节点，因为你 指针p的指向没有变，故一直都是给p指向的内存写入数据，在循环中写上这么一句  p = p->next; 删除r = p; 最后在循环外加上  p = NULL; r = p;这样可以一次给多个节点赋值，但是并不能将所有节点返回，只返回头节点，有头节点就可以循环查找。建议:creatList函数只创建一个节点。其次，你上传问题代码之后进行排版和注释方便阅读。（电脑没网络，用的手机，不能打出具体代码，请谅解）

user: user-0
content: 跪求大神    啊
user-0 提问: 找不到错误，挺简单的小程序。

回复:
user: user-0
content: 引用 2 楼 user-2 的回复:[quote=引用 1 楼 jyupup 的回复:] 各位帮帮忙。解决了立即采纳。。萌新刚学不久。。  楼主，下面的代码可供参考~~  #include<stdio.h> int main(void) { 	printf("Please input eight numbers:"); 	int i = 0, j = 0; 	double ch[8], sum[8]; 	while (i++ < 8) 		scanf_s("%lf", &ch[i-1]);  	sum[0] = ch[0]; 	while (j++ < 8) 		sum[j] = sum[j - 1] + ch[j];  	i = 0, j = 0; 	while (i++ < 8) 		printf("%lf  ", ch[i - 1]);  	while (j++ < 8) 		printf("%lf  ", sum[j - 1]); 	return 0;  }[/quote] 感谢解答 原来这段代码里已经改正错误了没有仔细看不好意思。。

user: user-0
content: 引用 2 楼 user-2 的回复:[quote=引用 1 楼 jyupup 的回复:] 各位帮帮忙。解决了立即采纳。。萌新刚学不久。。  楼主，下面的代码可供参考~~  #include<stdio.h> int main(void) { 	printf("Please input eight numbers:"); 	int i = 0, j = 0; 	double ch[8], sum[8]; 	while (i++ < 8) 		scanf_s("%lf", &ch[i-1]);  	sum[0] = ch[0]; 	while (j++ < 8) 		sum[j] = sum[j - 1] + ch[j];  	i = 0, j = 0; 	while (i++ < 8) 		printf("%lf  ", ch[i - 1]);  	while (j++ < 8) 		printf("%lf  ", sum[j - 1]); 	return 0;  }[/quote] 感谢你的回答 不过我主要想找到自己程序的问题所在 想先养成自己的风格。。

user: user-1
content: 你的代码数组越界了，while(i++<8)第一次循环i的值已经是1了，而你的代码逻辑以为是0 int main() { 	printf("Please input eight numbers:"); 	int i = 0, j = 0; 	double ch[8], sum[8]; 	while (i++ < 8) 		scanf_s("%lf", &ch[i-1]); 	sum[0] = ch[0]; 	while (j++ <8) 		sum[j] = sum[j - 1] + ch[j]; 	i = 0, j = 0; 	while (i++ < 8) 		printf("%lf  ", ch[i-1]); 	while (j++ < 8) 		printf("%lf  ", sum[j-1]); 	return 0; }

user: user-2
content: 引用 1 楼 jyupup 的回复:各位帮帮忙。解决了立即采纳。。萌新刚学不久。。  楼主，下面的代码可供参考~~  #include<stdio.h> int main(void) { 	printf("Please input eight numbers:"); 	int i = 0, j = 0; 	double ch[8], sum[8]; 	while (i++ < 8) 		scanf_s("%lf", &ch[i-1]);  	sum[0] = ch[0]; 	while (j++ < 8) 		sum[j] = sum[j - 1] + ch[j];  	i = 0, j = 0; 	while (i++ < 8) 		printf("%lf  ", ch[i - 1]);  	while (j++ < 8) 		printf("%lf  ", sum[j - 1]); 	return 0;  }

user: user-0
content: 各位帮帮忙。解决了立即采纳。。萌新刚学不久。。
user-0 提问: 三个数 分别取平均值

回复:
user: user-0
content: 谢谢 看成1了

user: user-1
content: scanf ("%lf%lf%lf",&x, &y, &z); 注意输入的是%lf不是%1f;即f前面的是一个l,字母l,大写是L，不是数字1.  即使是1也没关系，但是表达的意思就不一样了。建议查找一下相关的知识（带数字的输入格式）。 scanf ("%lf%lf%lf",&x, &y, &z);     printf("%lf, %lf, %lf\n", x, y, z); 输入之后加一条打印，确保输入的内容和自己想的是否一致，便于定位问题。
user-0 提问: 字符与字符串取地址

回复:
user: user-0
content: 谢谢，我知道了。

user: user-1
content: 正如楼上所说 char test = 'a'; &a的值是0x00D6F953  而0x00D6F953的内容是

user: user-2
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-3
content: 因为字符是常量，比如'a'，&'a'取地址怎么理解？我们取地址一般是对于变量来讲的  char ch = 'a'  printf("%p\n", &ch);   字符串本身就是地址，就像数组名就是数组的首地址一样。

user: user-4
content: char c = 'a'; printf("0x%x", &c); 哪里不能获取字符地址了？
user-0 提问: 请问如何快速按位匹配需要的值

回复:
user: user-1
content: KMP算法吧，这个速度比较快

user: user-0
content: 引用 1 楼 u014444402 的回复:扫一次不就可以了。。也不费时间吧。这个只是一个32位，如果数量多了的话时间就体现出来了。

user: user-2
content: 扫一次不就可以了。。也不费时间吧。
user-0 提问: 不用C语言加锁，echo "hello world" >> test.txt能做到原子性吗？

回复:
user: user-1
content: 《Windows核心编程》

user: user-2
content: 这不是echo的问题，你打开了再多system(echo)也只不过是打开了很多cmd的进程而已，这些进程有自己的进程空间相互不干扰，都是输出到自己的进程空间。 你想问的其实是>> test.txt 输出到文件，cmd文件的读写应该是不共享写入的，一个cmd进程只能等待test.txt的句柄关闭之后才能写入，这时候cmd的程序本身应该是等待的，你可以测试一下，挂一下NtCreateFile函数 参考 HANDLE WINAPI CreateFile( _In_ LPCTSTR lpFileName, _In_ DWORD dwDesiredAccess, _In_ DWORD dwShareMode, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _In_ DWORD dwCreationDisposition, _In_ DWORD dwFlagsAndAttributes, _In_opt_ HANDLE hTemplateFile );
user-0 提问: 关于链表 为啥这个y输出不了，链表的建立有问题么

回复:
user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct a{     int shuzi;     struct a*point; } hei;  //int a = 0; void diy_free(hei *head) {     head = head->point;     hei *p2;     while (head != NULL)     {         p2 = head->point;         free(head);         head = p2;     } }  void diy_jia(hei *head, int number) {     hei* p1, *pnew;      p1 = head;     for (;number > 0; number--) {         pnew = (hei *)malloc(sizeof(hei));         if (!pnew)             return;          p1->point = pnew;         p1 = pnew;     }     p1->point = NULL; #if 0     if (!(head)->point)     {         for (number; number>0; number--)         {             p1 = (hei*)malloc(sizeof(hei));             head->point = p1;             head = p1;         }     }      else     {         while (head->point)             head = head->point;         for (number; number>0; number--)         {             p1 = (hei*)malloc(sizeof(hei));             head->point = p1;             head = p1;         }     }     head->point = NULL; #endif }  void main() {     int y;     hei* head = (hei*)malloc(sizeof(hei));     if (head == NULL)         return;      head->point = NULL;     head->shuzi = 0;      diy_jia(head, 8);      hei* ptemphead = head;     for (y = 0; head->point; head = head->point)         y++;      printf("%d", y);      head = ptemphead;      diy_free(head);      free(head); } 参考一下吧

user: user-3
content: 楼主，你上面的代码，刚开始hei *head;这行代码没有给head初始化，导致编译不通过，还是diy_free里面的代码也存在错误。下面代码可供参考： #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct a{ 	int shuzi; 	struct a*point;  } hei;  int a = 0; void diy_free(hei *head) { 	head = head->point; 	hei *p2; 	while (head != NULL) 	{ 		p2 = head->point; 		free(head); 		head = p2; 	} }  void diy_jia(hei *head, int number) { 	hei* p1; 	if (!(head)->point) 	{ 		for (number; number>0; number--) 		{ 			p1 = (hei*)malloc(sizeof(hei)); 			head->point = p1; 			head = p1; 		} 	}  	else 	{ 		while (head->point) 			head = head->point; 		for (number; number>0; number--) 		{ 			p1 = (hei*)malloc(sizeof(hei)); 			head->point = p1; 			head = p1; 		} 	} 	head->point = NULL;  }  void main() { 	int y; 	hei* head = (hei*)malloc(sizeof(hei)); 	if (head == NULL) 		return;  	head->point = NULL; 	head->shuzi = 0;  	diy_jia(head, 8);  	hei* ptemphead = head; 	for (y = 0; head->point; head = head->point) 		y++;  	printf("%d", y);  	head = ptemphead;  	diy_free(head);  	free(head); }
user-0 提问: 解释一下运行结果为什么是0 0 0 0 0 1 2 3 4

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-2
content: 答案并非书上写的0 0 0 0 0 1 2 3 4 。 要搞明白这道题的答案，就需要我们明白变量在内存中的存储位置和存储方式，以及scanf("%d",&c);这句语句的具体执行方式。 首先，作为局部变量i和c，在内存中的存储位置是由高位地址向低位地址存放的，如下图所示。所以整型i的存储起始地址是0060FF08，在内存中0060FF08，0060FF09，0060FF0A和0060FF0B这四个字节表示了i 其次，int类型的i占的这4个字节，也是从高位地址向低位地址存放的，如下图所示。也就是说当i = 1时,地址0060FF0B存储的是i最低位的00000001部分，所以按顺序0060FF0B+0060FF0A+0060FF09+0060FF08组成的值是i  然后就是scanf("%d",&c)的执行方式：当程序要求scanf读入一个整数，应该传递给它一个指向整型的指针。而程序中scanf函数得到的却是个指向字符的指针。由于scanf函数并不能分辨这种情况，所以它只是将这个指向字符的指针作为指向整数的指针而接受，并且在指针指向的位置存储一个整数。 也就是说，由于c是字符，所以只分配了1个字节的内存给c，然后指派了一个指向字符的指针用来指向c（也就是图中的地址0060FF07）；但是scanf明明读到的是个int型啊，所以scanf在往这个地址写东西的时候，确实是把这个读到的整数都写进去了，于是就冲掉了上面i的后三个字节。然后每次循环时i++，变成1后，scanf一读一写，i的最后三个字节就被冲掉了，所以i的值就一直被改写，只要不满足循环的终止条件，就只能一直这么死循环下去。 要验证这个说法，只要在scanf("%d",&c)时输入>=1025的整数，满足条件了，也就终止循环了。  另外，根据scanf函数的特性，如果在scanf("%d",&c)时遇到输入的是非数字字符，比如'a'，scanf也会停止读入，然后scanf()函数把非数字字符放回输入。这意味着在改程序下一次读入时，首先读取到的是上一次丢弃的非数字字符。然后这里就等于没有往c里写值，所以也就能够满足条件，终止循环了。 以下代码供参考  #include<stdio.h>  main() {     int i = 2;     char c;     unsigned char * p = (unsigned char *)(&i);     printf("i %p,sizeof(i) = %d\n",&i,sizeof(i));     printf("c %p,sizoef(c) = %d\n",&c,sizeof(c));      printf("init: 第1字节（最低位）：%d,第2字节：%d,第3字节：%d,第4字节（最高位）：%d\n",*p,*(p+1),*(p+2),*(p+3));     printf("init: 第1字节（最低位）地址：%p,第2字节地址：%p,第3字节地址：%p,第4字节（最高位）地址：%p\n",p,(p+1),(p+2),(p+3));     for(i = 0; i < 5; i++)     {         p = (unsigned char *)(&i);         printf("before scanf: 第1字节：%d,第2字节：%d,第3字节：%d,第4字节：%d\n",*p,*(p+1),*(p+2),*(p+3));         scanf("%d",&c);         p = (unsigned char *)(&i);         printf("after scanf: 第1字节：%d,第2字节：%d,第3字节：%d,第4字节：%d\n",*p,*(p+1),*(p+2),*(p+3));         printf("%d\n",i);     }     printf("\n"); }

user: user-3
content: 建议打出i，c的地址。 i = 0x7fff2eebf604 c = 0x7fff2eebf603  这是我打印出来的地址值。  出现你的问题的原因应该是c是%d格式输入的，因为%d默认是sizeof(int)个字节，这样就会导致每次输入之后就会将i的内容覆盖，导致每次输入之后，i的值都是0，最后是一个死循环（在我的平台上是这样的）。

user: user-4
content: 语言应该没有规定变量地址分布 你那个是未定义行为

user: user-5
content: 在输入时scanf("%d",&c); 是错误的，c是char型，应该用%c 。在修改后，你可以把printf("%x,%x",&i,&c);输出两者的地址，

user: user-6
content: 你的输入是什么‘
user-0 提问: C语言基础 大佬帮看看

回复:
user: user-1
content: 是你对题意的理解产生了偏差，并非你认为的以40分钟为一个周期。 你可以检查一下，当t = 100时，应该是兔子胜出，但你的程序判断为乌龟胜出。 题目很简单，你可以先用常规思路解决问题，或者先列举前180分钟内每隔10分钟的情况，然后再来找规律。

user: user-2
content: 周期是90分钟，LZ自己画图分析一下

user: user-2
content: #include <stdio.h>    int compare(int time)  {  	if(time>90)  	{  		printf("time error");  		return 0;  	}  	else if((time>0&&time<30)||(time>45&&time<60))  	{  		printf("^_^ ");  		return 1;//兔子快  	}  	else if(time>30&&time<45||(time>60&&time<90))  	{  		printf("@_@ ");  		return 2;//乌龟快  	}  	else  	{  		printf("-_- ");  		return 3;//一样快  	}  }    int howlong(int who,int time,int cir)  {  	switch(who)  	{  		case 1:if(time<=10){return (cir*270+time*9);}  		       else if(time<=40){return (cir*270+90);}  		       else if(time<=50){return (cir*270+90+time*9);}  		       else if(time<=80){return (cir*270+180);}  		       else if(time<=90){return (cir*270+180+time*9);}  		       else{printf("time error"); return 0;}  		       break;  		case 2:return (cir*270+time*3);break;  		case 3:return (cir*270+time*3);break;  	}  }    void main()  {  	int time,cir;  	printf("how long the time is(min):");  	scanf("%d",&time);  	cir=time/90;  	time%=90;  	printf("%d meter\n",howlong(compare(time),time,cir));  }
user-0 提问: C 返回结构体数据编译出现错误

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:楼主，在FIND_MAXIMUM_SUBARRAY函数中的s1=FIND_MAXIMUM_SUBARRY(a,low,mid);和s2=FIND_MAXIMUM_SUBARRY(a,mid+1,high);的函数名写错了，应该是该FIND_MAXIMUM_SUBARRY为FIND_MAXIMUM_SUBARRAY吧。。。。  我TM。。。。。花了好几个小时。

user: user-1
content: 下面代码，在vs2013编译通过，楼主可以查看一下~~~ # include<stdio.h> # include<stdlib.h>  //分治算法求最大子数组   struct RETURN FIND_CROSSING_SUBARRAY(int*, int, int);    //跨中点寻找最小数组  struct RETURN FIND_MAXIMUM_SUBARRAY(int*, int, int);  struct RETURN { 	int low; 	int high; 	int num; };                                          //定义用于调用函数返回的结构体   int main() { 	int a[] = { 13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7 }; 	struct RETURN s; 	s = FIND_MAXIMUM_SUBARRAY(a, 0, 15); 	printf("数组中最大的子数组为：a[%d]—a[%d],其和为：%d", s.low, s.high, s.num); 	getchar(); 	return 0; }  struct RETURN FIND_CROSSING_SUBARRAY(int *a, int left, int right)      // 跨中点寻找最小数组的实现  { 	int left_sum = -10000; 	int sum = 0, mid = (left + right) / 2; 	//	struct RETURN s={"-1000","1000","-10000"}; 	struct RETURN s; 	for (int i = mid; i >= left; i--){                          //寻找左边最大数组  		sum = sum + a[i]; 		if (sum>left_sum){ 			left_sum = sum; 			s.low = i; 		} 	} 	int right_sum = -10000; 	sum = 0; 	for (int i = mid + 1; i <= right; i++){                       //寻找右边最大数组  		sum = sum + a[i]; 		if (sum >= right_sum){ 			right_sum = sum; 			s.high = i; 		} 	} 	s.num = left_sum + right_sum; 	return s; }  struct RETURN FIND_MAXIMUM_SUBARRAY(int* a, int low, int high)    //分治递归调用函数  { 	struct RETURN s; 	if (high == low){ 		s.low = low, s.high = high, s.num = low; 		return s; 	} 	else{ 		struct RETURN s1, s2, s3; 		int mid = (low + high) / 2; 		s1 = FIND_MAXIMUM_SUBARRAY(a, low, mid); 		s2 = FIND_MAXIMUM_SUBARRAY(a, mid + 1, high); 		s3 = FIND_CROSSING_SUBARRAY(a, low, high); 		if (s1.num >= s2.num&&s1.num >= s3.num) 			return s1; 		else if (s2.num >= s1.num&&s2.num >= s3.num) 			return s2; 		else if (s3.num >= s2.num&&s3.num >= s1.num) 			return s3; 	}  }

user: user-1
content: 楼主，在FIND_MAXIMUM_SUBARRAY函数中的s1=FIND_MAXIMUM_SUBARRY(a,low,mid);和s2=FIND_MAXIMUM_SUBARRY(a,mid+1,high);的函数名写错了，应该是该FIND_MAXIMUM_SUBARRY为FIND_MAXIMUM_SUBARRAY吧。。。。
user-0 提问: CCS工程编译报错INTERNAL ERROR: Space required for local variables exceeds maximum in m

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。非常感谢！

user: user-1
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
user-0 提问: c与指针-第一个程序用codeblocks编译报'columns'未声明（在此函数中首次使用）|

回复:
user: user-0
content: 后来自己发现了

user: user-1
content: 多一个n ，注意单词拼写

user: user-2
content: 楼主，这行代码中rearrange( output, input, n_columns, columns ); 这个columns 变量应该写错了吧？应该是colums这个变量才对吧。还是read_column_number函数只声明了，还没有定义呢。。下面的代码在vs2013中编译通过，楼主，可以看看~~~ #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_COLS 20             /* 所能处理的最大行号*/ #define MAX_INPUT 1000          /* 每个输入行的最大长度*/  int read_column_number(int columns[], int max); void rearrange(char *output, char const *input, int n_columns, int const columns[]); int main(void) { 	int n_columns;              /* 进行处理的列表号 */ 	int colums[MAX_COLS];       /* 需要处理的列数 */ 	char input[MAX_INPUT];      /* 容纳输入行的数组 */ 	char output[MAX_INPUT];     /* 容纳输出行的数组 */ 	/* 	** 读取该串列标号 	*/ 	n_columns = read_column_number(colums, MAX_COLS);  	/* 	**读取、处理和打印剩余的输入行 	*/ 	while (gets(input) != NULL){ 		printf("Original input : %s\n", input); 		rearrange(output, input, n_columns, colums); 		printf("Rearranged line: %s\n", output); 	} 	return EXIT_SUCCESS; }  /* ** 读取列标号，如果超出规定范围则不予理会。 */ int read_columns_numbers(int columns[], int max) { 	int num = 0; 	int ch;  	/* 	** 取得列标号，如果所读取的数小于0则停止。 	*/ 	while (num < max && scanf("%d", &columns[num]) == 1 		&& columns[num] >= 0) 		num += 1;  	/* 	** 确认已经读取的标号为偶数个，因为他们是以对的形式出现的。 	*/ 	if (num % 2 != 0){ 		puts("Last columns number is not paired."); 		exit(EXIT_FAILURE); 	}  	/* 	** 丢弃该行中包含最后一个数字的那部分内容。 	*/ 	while ((ch = getchar()) != EOF && ch != '\n') 		; 	return num; }  /* **处理输入行，将指定列的字符连接在一起，输出行以NUL结尾。 */ void rearrange(char *output, char const *input, 	int n_columns, int const columns[]) { 	int col;           /* columns数组的小标 */ 	int output_col;    /* 输出列计数器 */ 	int len;           /* 输入行的长度 */  	len = strlen(input); 	output_col = 0;  	/* 	** 处理每列标号 	*/ 	for (col = 0; col < n_columns; col += 2){ 		int nchars = columns[col + 1] - columns[col] + 1;  		/* 		** 如果输入行结束或输出行数组已满，就结束任务。 		*/ 		if (columns[col] >= len || 			output_col == MAX_INPUT - 1) 			break;  		/* 		** 如果输出行数据空间不够，只复制可以容纳的数据。 		*/ 		if (output_col + nchars > MAX_INPUT - 1) 			nchars = MAX_INPUT - output_col - 1;  		/* 		** 复制相关数据 		*/ 		strncpy(output + output_col, input + columns[col], 			nchars); 		output_col += nchars; 	} 	output[output_col] = '\0'; }  //下面函数需要添加代码 int read_column_number(int columns[], int max) { 	return 0; }

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

回复:
user: user-0
content: 谢谢大家的指导。

user: user-1
content: 可以正常运行

user: user-2
content: char sBuf[256] 这样写没有问题  但如果写成：char* sBuf = .. 就会有问题，因为这个字符串是常量

user: user-3
content: 建议自己用代码调试一下； 从这句代码上来看，不会有问题。

user: user-0
content: 谢谢。我写了个程序，测试了一下。正常。

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

回复:
user: user-1
content: 首先puts和strlen都是找\0  在有的编译器里，char[]这个东西是根据后面{}里面的内容分配大小的，所以你这三个走下来都是对的，比如我用dev c++编译是对的。  但是有的编译器里，比如vs，会把内存里所有的地址的值都默认为0xcc，但是其他程序可能会使用了某些地址，已经写了一些值，这时你的前两种情况后面的东西是自带\0的，所以前两个char[]在内存上分配到了13，用puts或strlen找到第13位的\0返回12，然后你第三种自己是不带\0的，就是在内存上分配到了12，用puts或strlen的时候会在内存地址上一直往后找\0，所以根据不同的电脑来编译，输出的长度和字符内容都不一样，会有一些乱码。  而你现在的这个就很巧合，内存分配是随机的，但还是有规律，比如就近选取，你的正好就是c的12个后面跟了a或b的13个，所以打下来就是两个hello world！和24，而我自己试验打下来是hello world！烫烫烫烫hello world！，32长度，用十六进制展开就是'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!','\0'，中文烫的十六进制就是0xcccc  至于当你写成char[100]时，就是abc各申请了连续的100内存，这时候除过三者的12个字符数据不会连在一起，对有限定长度的数组，赋值时，不满100的其他位，vs会直接赋值\0，这些加断点都是可以看到的

user: user-0
content: 引用 9 楼 weixin_42559124 的回复:一个个字符输入字符数组后，系统不会在后面自动加\0，而strlen函数的结束条件是遇到\0自动结束，所以strlen不正确，我按照你的代码试了一下但是输出结果和你的不同输出结果如下：hello world!€ 15Press any key to continue，可能答得不好请多多见谅 。 怎么会是15个字符，长度明明是12个呀！

user: user-0
content: 引用 7 楼 goldenhawking 的回复:程序有问题。没有 \0 结束很危险。 你这是Debug还是Release？如果碰巧数组后面没有0填充，就有意外了。 正确的： const char  * c = "hello world"; char c[] = {'a','b','c',0}; 您看，我定义的char c[]={"..."}和定义的char c[100]={"..."}得到的结果是不一样的

user: user-2
content: 一个个字符输入字符数组后，系统不会在后面自动加\0，而strlen函数的结束条件是遇到\0自动结束，所以strlen不正确，我按照你的代码试了一下但是输出结果和你的不同输出结果如下：hello world!€ 15Press any key to continue，可能答得不好请多多见谅 。

user: user-0
content: 引用 5 楼 zhao_miao 的回复:puts打印字符串，遇到‘\0’会停止，因为你的char c[]没有'\0',所有它打印出hello，world之后会打印随机值。 strlen也是遇到‘\0’停止，char c[]没有'\0'所有打印出来的也是随机值也不随机啊，因为试了好几次都是输出了两遍得hello world！

user: user-3
content: puts打印字符串，遇到‘\0’会停止，因为你的char c[]没有'\0',所有它打印出hello，world之后会打印随机值。 strlen也是遇到‘\0’停止，char c[]没有'\0'所有打印出来的也是随机值

user: user-4
content: 程序有问题。没有 \0 结束很危险。 你这是Debug还是Release？如果碰巧数组后面没有0填充，就有意外了。 正确的： const char  * c = "hello world"; char c[] = {'a','b','c',0};

user: user-5
content: 第一个不是字符串，而是字符数组。因为没有'\0'。 第二个也是字符数组，但是指定了字符数组的长度100，实际字符长度是12个，后面的88个字符是用'\0'填充。因此可以认为是字符串。

user: user-0
content: 就在红框里面，我列出的是三种字符串的表达形式，第三种如果没有规定字符串数组的长度的话，用puts()函数的话输出额是两遍“hello world！”而且看出字符串的长度是上两种表达形式的二倍，但是我给字符串数组规定长度的话（长度为大于12的任意值），三种表达方式输出的结果都一样了，我想知道这是为什么。   很抱歉，这是我第一次问问题，还是菜鸡的说

user: user-6
content: 什么问题也不说，还要别人猜吗？

user: user-7
content: ...,'!',0};

user: user-7
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
user-0 提问: 二哥养细菌问题，运行时输入完敲回车没反应，不知道哪里错了

回复:
user: user-1
content: //while (HaveZeroFlag=1)             while (HaveZeroFlag==1) 这儿死循环了。因此跳不出循环。判断语句不是赋值语句，建议以后注意

user: user-2
content: while (HaveZeroFlag=1)  死循环 改成 while (HaveZeroFlag==1)
user-0 提问: C语言基础 初学者 大佬帮看一下问题出在哪了

回复:
user: user-0
content: 引用 1 楼 zjjone 的回复:sacnf("%lf %lf",&a,&b); sacnf这是什么东西？谢老哥，真是蠢到家了

user: user-1
content: 这种问题编译会描述的很清楚啊

user: user-1
content: sacnf("%lf %lf",&a,&b); sacnf这是什么东西？
user-0 提问: glibc中的源码感觉不完整啊

回复:
user: user-1
content: 这本来就不是真正的定义，就是一个别名，类似C++的模板，在编译的时候才真正生成定义。 个人理解，不喜勿喷。

user: user-0
content: 引用 1 楼 zjjone 的回复:这本来就不是真正的定义，就是一个别名，类似C++的模板，在编译的时候才真正生成定义。 个人理解，不喜勿喷。 那按理说也应该有个具体的定义啊，比如说一个个的去读什么的，这里面只有出现错误时的反应。
user-0 提问: 关于getchar函数

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:你仔细看一下，其实也是循环了10次，只不过gets(name[i])时取到的都是你输入num[i]之后的'\n'： input No.:2 input name:input No.:sd input name:input No.:4 input name:input No.:sd input name:input No.:5 input name:input No.:cvbg input name:input No.:7 input name:input No.:dhh input name:input No.:9 input name:input No.:cgh input name: 具体可以参考：https://bbs.csdn.net/topics/390726616 就是说，使用scanf()时，遇到空格键、Tab键或者回车键结束一次输入，但是不会舍弃最后的回车符或空格或Tab（即还在缓冲区中），需要使用getchar来吸收scanf()执行之后的符号。 gets()会一直读取输入的内容，直至回车（遇到回车则认为输入结束），同时以'\0'代替'\n'这个换行符(意思是'\n'既不会被放到字符数组中，也不会被存入到缓存区，也就是这个回车被舍弃了) 所以，就像你遇到的情况，在没有使用getchar()时，比如输入的是1'\n'，这个1被num[i]接收，但是回车还在缓冲区中，被后面的gets(name[i])接收了（然后舍弃），如此循环10遍。 使用了getchar()之后，这个回车被getchar()接收，那么后序的输入就能正常被gets(name[i])接收，就达到你的预期了。谢谢，我知道是为什么了

user: user-1
content: 你仔细看一下，其实也是循环了10次，只不过gets(name[i])时取到的都是你输入num[i]之后的'\n'： input No.:2 input name:input No.:sd input name:input No.:4 input name:input No.:sd input name:input No.:5 input name:input No.:cvbg input name:input No.:7 input name:input No.:dhh input name:input No.:9 input name:input No.:cgh input name: 具体可以参考：https://bbs.csdn.net/topics/390726616 就是说，使用scanf()时，遇到空格键、Tab键或者回车键结束一次输入，但是不会舍弃最后的回车符或空格或Tab（即还在缓冲区中），需要使用getchar来吸收scanf()执行之后的符号。 gets()会一直读取输入的内容，直至回车（遇到回车则认为输入结束），同时以'\0'代替'\n'这个换行符(意思是'\n'既不会被放到字符数组中，也不会被存入到缓存区，也就是这个回车被舍弃了) 所以，就像你遇到的情况，在没有使用getchar()时，比如输入的是1'\n'，这个1被num[i]接收，但是回车还在缓冲区中，被后面的gets(name[i])接收了（然后舍弃），如此循环10遍。 使用了getchar()之后，这个回车被getchar()接收，那么后序的输入就能正常被gets(name[i])接收，就达到你的预期了。
user-0 提问: 为什么字符串只能输出不全

回复:
user: user-1
content: 引用 3 楼 qq_40478293 的回复:put读取的字符串中有空格，所以被终止读取了 最好验证一下再确认你的思路是否正确。  遇到空格是不会终止输出的。 只输出hello的原因是i在变化，s的地址也在发生变化，一次循环其实i向后了2次，但是输出时没有借助i； void  put(char *s) {     int i ;     for (i=0;s[i]!='\0' ;i++ )     {         //putchar(*s++);         putchar(s[i]);     } } 这样就可以全部输出了

user: user-2
content: 赵4老师说得非常有道理，不过有时候也可以通过打印中间变量来调试程序，也可以带来不少收获。 #include <stdio.h> #include <stdlib.h> void  put(char *s);  int main(int argc, char *argv[]) {     char s1[]="hello  world";     put(s1);     putchar('\n');     return 0; } void  put(char *s) {     int i ;     for (i=0; s[i]!='\0' ; i++ )     {         printf("i = %d, putchar(*s++) = ",i);         putchar(*s++);         printf(", after *s++, s = \"%s\", when i = %d,s[%d] = %c\n",s, i+1, i+1, s[i+1]);     } } 结果如图

user: user-3
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-4
content: 引用 1 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。我也是经常程序出问题，但是不知道怎么调试，以前用过vc6++设断点调试，但是调试结果和我想得不一样，而输出结果却是正确的，不知道是我自己的断点没设对，还是什么原因，有没有介绍VS调试方面的内容，书或者视频，或者其他的可以推荐一下吗，谢谢

user: user-5
content: i=0时，s[i]='h'，输出*s++  即打印字符 'h'；同时指针向后移一位，指向e； i=1时，s[i]='l'  ,  输出*s++  即打印字符 'e' ;  同时指针向后移一位，指向l(第一个L)； i=2时，s[i]='o'  ,  输出*s++  即打印字符 'l' ;  同时指针向后移一位，指向l（第二个L）； 依次往下推理，就是s[i]='\0'，已经判断完了，循环结束，putchar才打印到hello这个位置；  可以修改为：putchar(*(s+i));   或  purchar(s[i]);

user: user-6
content: put读取的字符串中有空格，所以被终止读取了

user: user-7
content: 因为putchar(*s++);这里s++,s应该变了，到hello 输出完的时候s[i]已经是0了。

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

回复:
user: user-1
content: 乘法符号，就是10 × i；pcou+10 *i就是pcou向后偏移10 * i个字节。

user: user-2
content: 引用 6 楼 kfyniriu1 的回复:pcou+10 *i  char是一个字节，pcou+10 *i 表示每次循环向后移10个字节，也就是数组每接收一个字符串，就换到下一行接收下一个字符串。二维数组每一行只保存一个字符串 for语句，第一个是用；不是用， 正确

user: user-2
content: 二维数组。    每次循环就跳到下一行指向下一行的一维数组开头  一共5行

user: user-0
content: 我的天  乌龙了   谢谢大家

user: user-3
content: pcou+10 *i  char是一个字节，pcou+10 *i 表示每次循环向后移10个字节，也就是数组每接收一个字符串，就换到下一行接收下一个字符串。二维数组每一行只保存一个字符串  for语句，第一个是用；不是用，

user: user-4
content: 引用 4 楼 zhao4zhong1 的回复:10*i 的意思 是 10乘以i 不是 10后面紧跟取i这个指针所指的值 ！  回答正确

user: user-5
content: 10*i 的意思 是 10乘以i 不是 10后面紧跟取i这个指针所指的值 ！

user: user-5
content: Pointer Arithmetic Additive operations involving a pointer and an integer give meaningful results only if the pointer operand addresses an array member and the integer value produces an offset within the bounds of the same array. When the integer value is converted to an address offset, the compiler assumes that only memory positions of the same size lie between the original address and the address plus the offset.  This assumption is valid for array members. By definition, an array is a series of values of the same type; its elements reside in contiguous memory locations. However, storage for any types except array elements is not guaranteed to be filled by the same type of identifiers. That is, blanks can appear between memory positions, even positions of the same type. Therefore, the results of adding to or subtracting from the addresses of any values but array elements are undefined.  Similarly, when two pointer values are subtracted, the conversion assumes that only values of the same type, with no blanks, lie between the addresses given by the operands.

user: user-0
content: 回答跑题了 。。。。 我是问 scanf 中   *i   的作用是什么  我之前没看过  这个是一本书里的写法

user: user-6
content: 引用 楼主 qq_40750570 的回复:........ int i; char course [5][10],  *pcou; pcou = course[0]; for (i=0,i<5;i++) {          scanf("  %s  ", pcou+10 *i);  } ***************************************** scanf中的 *i  是什么意思   之前没看过  楼主，个人认为，因为pcou指针指向二维数组char* course [5][10]，而二维数组course的内存是连续的，所以在for循环的五次执行中，pcou分别指向如下： 1) pcou+ 0  -->等于course[0 2) pcou + 10 -->等于course[1] 3) pcou + 20 -->等于course[2] 4) pcou + 30 -->等于course[3] 5) pcou + 40 -->等于course[4]  即5次输入的scanf类似如下： 1）scanf("  %s  ", course[0]); 2）scanf("  %s  ", course[1]); 3）scanf("  %s  ", course[2]); 4）scanf("  %s  ", course[3]); 5）scanf("  %s  ", course[4]);
user-0 提问: c语言，求助什么意思

回复:
user: user-1
content: i，j，k都没有定义啊？

user: user-2
content: 代码不全 是作业吧

user: user-3
content: 不懂，代码不全吧，3个向量?

user: user-4
content: 引用 2 楼 donjin9 的回复:不懂，代码不全吧，3个向量? 同意，都不知道那个是什么

user: user-5
content: 《立体几何》
user-0 提问: 关于紫书(刘汝佳) 悲剧文本 UVA11988 的问题

回复:
user: user-1
content: 建议你先用udebug上跑一下11988的测试数据，看看会不会TLE，顺便可以验证一下程序到底对不对。 https://www.udebug.com/UVa/11988
user-0 提问: C语言三天打鱼两天筛网的程序 求教 ！找了好久没找出问题，大神看看是逻辑问题吗？万分感谢

回复:
user: user-1
content: 修改代码： numy=year(Nyear); numm=month(Nmonth, Nyear);  你子函数里的numy、numm是局部变量，return后需要变量接收，而你main里的numy、numm和子函数的numy、numm不是一回事，除非你把numy、numm申明在main外面作为全局变量，才能这么写  在插说一下，你这程序设计上的东西，不说一月和一月天数不一样、闰年闰月的问题，你这是从2001年1月1日起算的把，月份等于1的时候，加31天合适吗？

user: user-0
content: 不是，已经解决了

user: user-2
content: numy numm没赋值吧，在循环里改改看。 numy = year(Nyear); numm = month(Nmonth,Nyear);
user-0 提问: 小白初学C语言

回复:
user: user-1
content: 小白不要用复杂的编译器，你用C/C++程序设计学习与实验系统（可以切换三种编译器）吧，以后可以用dev-C++（简洁大方），如果是每次要新建项目的那种，强烈建议小白不要用这种。

user: user-2
content: 没有错啊我用的是DevC++ 你可以换个编译器试看看

user: user-3
content: 创建的文件类型不对,你都说学的是C,可你的文件命名为obj.请更改文件后缀为.c就可以了

user: user-4
content: 文件名例如：helloworld.c

user: user-5
content: C语言是.C文件

user: user-6
content: obj是旧的，清除整个编译。重新编译整个工程

user: user-7
content: 年轻人，先问是不是，在问为什么。

user: user-8
content: 是不是用了全角的分号,看下英文提示

user: user-9
content: VC6.0是void main，int main 一般都是CFREE。推荐将代码复制一下，关闭重启一下软件，确保正确的情况下新建工程，将代码粘贴过来编译应该就会好了

user: user-10
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-11
content: 是不是工程创建错误了

user: user-12
content: 英文错误没有贴出来。

user: user-7
content: 程序有重大不规范。我就是不说哈哈。。。。自己百度。int main（void）和int main（）；区别。用gcc编译学习。

user: user-13
content: 最关键的错误信息不发出来！

user: user-14
content: 确定创建的win32控制台应用？

user: user-15
content: 你用的什么软件，我用vs2017和vc++6.0都可以正常显示啊

user: user-16
content: 创建的文件类型不对

user: user-17
content: ide有问题

user: user-18
content: 程序的确没问题，难道是用了传说中的VC 6.0？
user-0 提问: 关于三重循环if无法判断的问题

回复:
user: user-1
content: 引用 4 楼 user-2 的回复:[quote=引用 3 楼 zangfong 的回复:] [quote=引用 2 楼 user-2 的回复:] 1楼的程序直接拷贝运行，输入972没有问题，输出的结果是YES。  但建议将for语句的判断条件由1000次减少到素数个数一样大小的次数 原程序中的sum并不等于素数之和啊，大哥。。。 for循环的取值范围是必须降的，因为a[1000]是局部变量，都没有初始化，a[168]后面的值都是随机的啊[/quote]  我记得结果是2+3+967，你可以运行下程序看看[/quote]  我试过，按照原来的程序，输出的结果是972 = 11+3+89，要不你调试一下试试？

user: user-2
content: 引用 3 楼 zangfong 的回复:[quote=引用 2 楼 user-2 的回复:] 1楼的程序直接拷贝运行，输入972没有问题，输出的结果是YES。  但建议将for语句的判断条件由1000次减少到素数个数一样大小的次数 原程序中的sum并不等于素数之和啊，大哥。。。 for循环的取值范围是必须降的，因为a[1000]是局部变量，都没有初始化，a[168]后面的值都是随机的啊[/quote]  我记得结果是2+3+967，你可以运行下程序看看

user: user-1
content: 引用 2 楼 user-2 的回复:1楼的程序直接拷贝运行，输入972没有问题，输出的结果是YES。  但建议将for语句的判断条件由1000次减少到素数个数一样大小的次数 原程序中的sum并不等于素数之和啊，大哥。。。 for循环的取值范围是必须降的，因为a[1000]是局部变量，都没有初始化，a[168]后面的值都是随机的啊

user: user-2
content: 1楼的程序直接拷贝运行，输入972没有问题，输出的结果是YES。  但建议将for语句的判断条件由1000次减少到素数个数一样大小的次数

user: user-1
content: 是你的三层循环写的有问题，以下代码供参考： #include <stdio.h> #include <stdlib.h> #include <math.h> int isPrime(int n)            //1000内判断素数 {     int i;     for(i = 2;i<=(int)sqrt(n);i++)         if(n%i == 0)             return 0;     return 1; } int main() {     int n,i,k,sum;     int a[1000];     int j=0;     int prime_cnt;      for(n=2;n<=1000; n ++)         if(isPrime(n))             a[j++] = n;     prime_cnt = j;     scanf("%d",&n);           //将1000内素数存放入数组里     if(n==1)         printf("No\n");     else{         for(i=0;i<prime_cnt;i++){             sum=a[i];             for(j=0;j<prime_cnt;j++){                 sum=sum+a[j];                 for(k=0;k<prime_cnt;k++){                     sum=sum+a[k];                     if(sum==n){                         printf("Yes,%d = %d+%d+%d\n",n,a[i],a[j],a[k]);                         return 0;                     }                     sum -= a[k];                 }                 sum -= a[j];             }         }         printf("No\n");         return 0;     }     return 0; }
user-0 提问: if else if的顺序和二次指针

回复:
user: user-1
content: 不要依赖调试器输出复杂数据结构！而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出，非常有助于调试！或者可以说是“基础设施” 十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-2
content: 楼主：个人认为，你第二张图的代码运行过程应该是这样的： 1.第一步应该运行if (key < (*p)->key) p = &(*p)->left;或者if (key > (*p)->key) p = &(*p)->right;    这时因为没有给左节点和右节点分配内存，所以这时左节点和右节点应该指向非法内存或者为空的。 2.第二步，因为第一步没有跳出while循环，所以再执行while循环里面的代码语句，这时p指向的内存非法或者为空，   所以就会出现异常情况出现了。  而第一张图的代码，估计应该是先执行if ((*p)->key == 0)里面的语句，就创建新的根节点和左右节点，并且执行完后就 跳出了while循环。所以正确的。

user: user-3
content: contex不一样
user-0 提问: STM32实现位绑定遇见的难题，请各路大神支支招

回复:
user: user-1
content: 你参考一下这里 https://blog.csdn.net/hk604296024/article/details/41870963 对比你的BitBand这个宏的定义。 这里做底层的比较少，http://www.openedv.com/这里多一点。 现在STM的开发一般用HAL库，标准库已经不更新了。用HAL库， 再使用stm32cubemx 配置就可以用了。

user: user-0
content: 老哥，我刚开始学，我这个位绑定的函数的功能实现不了，也没有报错，麻烦帮我看看问题出在哪里？？

user: user-1
content: 。。。都2018年了怎么还用这种代码。用Cube一配置，后面的东西再用函数一封装就可以了。
user-0 提问: node的类型是什么意思

回复:
user: user-1
content: typedef起了别名叫node吧

user: user-0
content: 我好像明白了，我在这个工程里的另一个文件里建立了node类型的结构体外部变量。是不是这个原因。。。。

user: user-2
content: 你的结构体是 typedef struct  { ..... }node; 类型吗？
user-0 提问: error C2440: “=”:无法从“int (__cdecl *)(void)”转换为“int (__cdecl *)(int,int)”

回复:
user: user-1
content: 第一个 #include <stdlib.h> 内定义了MAX函数，在程序中用MAX（），会提示错误（），不过这个不是主要的问题。 主要问题在第二个，“int（*p）（int，int）”,2010vc里是类型转换问题，“int (__cdecl *)(void)”转换为“int (__cdecl *)(int,int)”计算机识别不了。 建议改一下： INT MAX(INT,INT); INT (*P)(INT,INT); 这可以解决报错的问题。

user: user-2
content: 你看的书太老了，1980年前的C使用函数声明，只要声明其返回值类型就行了，参数不用说明；ansi c建议有函数原型，参数个数和类型必须说明

user: user-0
content: 这段程序是在以前的教材上找的，，，感谢各位了，，哈哈哈

user: user-0
content: 明白了，，，万分感谢

user: user-3
content: #include <stdio.h> #include <stdlib.h> int max(int x,int y);  void main() { int (*pl)(int,int); int a,b,c; pl=max; scanf("%d,%d",&a,&b);     c=(*pl)(a,b);     printf("a=%d,b=%d,max=%d",a,b,c); system("pause"); }  int max(int x,int y) { int z; if(x>y) z=x; else z=y; return z; }

user: user-4
content: int max（）； 你声明是无参
user-0 提问: 关于Scanf，一个很奇怪的问题

回复:
user: user-1
content: 提醒：scanf是开源的！ C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\input.c

user: user-2
content: 具体不知道你要实现什么功能，所以只针对第一段代码，即输入 ：1 2 3 输出：0 0 0 0 0 0 0 0 0 3 0 0 0 说明一下这样的结果是怎么产生的：  首先申明一个会用到的知识点，即超范围赋值，uchar的范围是0~255 ，这时候如果你写uchar a=560； 那结果是什么，是会截断，560的二进制是1000110000，对于uchar一个字节，只会截取后面8位，及a=00110000（B）=48，从这里可以看出超限甚至说int到char的强转，都是按先取低位的规则来的（及先取右边）  再看你的代码，第一次循环，i=11，scanf("%x",&a[11]); 这句代码的第一步是用 x%的类型去取界面输入的值，然后把这个值放到第二个参数所指的位置（注意&代表的是取地址），那首先界面的1以x%类型写完整就是0x00000001(二进制是0000 0000 0000 0000 0000 0000 0000 0001)，然后&找到了a[11]的地址，将二进制数截断最后8位放进a[11]，即a[11]=0x01，但是没有结束，与int到char的强转会舍弃高位不同，现在是个数组(或者理解为指针)，用&获取了首地址后，会继续赋值，直到将x%代表的一个四字节uint数完全赋给uchar，即a[12]= 0000 0000=0x00  a[13]=0000 0000=0x00 a[14]=0000 0000=0x00，这一句scanf就赋值了四个char  同理i=10的时候，a[10]=0x02 a[11]=0x00 a[12]=0x00 a[13]=0x00, a[11]的位置被0x00覆盖 i=9的时候，a[9]=0x03 a[10]=0x00 a[11]=0x00 a[12]=0x00, a[10]的位置被0x00覆盖  最后就会得到 0 0 0 0 0 0 0 0 0 3 0 0 0

user: user-0
content: hhx ,1x ,2x ,3x  都能正常输出 是出在长度上？

user: user-0
content: 引用 6 楼 user-3 的回复:用 %hhx 为什么 i--的时候有问题，哪里出了问题？

user: user-0
content: 谢谢！  明白了

user: user-3
content: 用 %hhx

user: user-0
content: 那如果想输入 1byte 16进制 那怎么定义

user: user-0
content: 编译器0错误0警告

user: user-3
content: 而且你都不看编译器警告的吗？printf scanf这种错误很多新的编译器都会提示

user: user-3
content: 因为%x要求的类型是unsigned int啊

user: user-0
content: 求解 原因 在i--的时候 如果将类型改为int ，正常输出 如果在i--中scanf("%x",&a[i]);改为scanf("%x",&b); a[i]=b;  输出的也是正常的
user-0 提问: 如图1所示   整数就应该得0吗？还有1怎么用？如徒儿所示  c和d哪个是错的?本人小白请各位解释详细点

回复:
user: user-1
content: 3.9 整型变量不存在四舍五入，1÷2=0，  结果是1的话，2÷2=1       2÷3=1。  只取整数部分，小数部分舍去 3.7 题目交换的是a和b的值，选项c交换的是b和t的值，a作为中间变量。选项d，交换了a和b的值，t作为中间变量。具体过程如下 1、先把变量a的值赋予t  t=a;  此时t的值等于a； 2、将变量b的值赋予a   a=b；  此时a的值等于b； 3、最后将变量a的值赋予b； 上面a的值已经等于b了，此时就需要借助中间变量t，t的值等于a；那么就有 b=t；

user: user-2
content: 对楼上补充下3.7的A选项：         a = a+b;          -------------> 此时a的值已经改变，为原先的(a+b)         b = a-b;              = (a+b)-b             = a               ------------->此时b的值也已改变，为原先的a         a = a-b;            = (a+b)-a            = b               ------------->此时a值再次改变，为原先的a。

user: user-3
content: 1.a 2.c  1.整形不存在小数位。且C语言除法不存在四舍五入，只要不足1就全部舍弃。1/2在程序中的的详细运行步骤：首先将1/2这个运算转换为1除以2并求余数，结果是1除以2=0余1。而1/2则取前面的数作为结果“0”，1%2（求余）取后面的数作为结果“1”。 2.a是可以实现的，你可以随便放几个数进去试试看；b也是正确的，同理D也正确。故C错误。 t中的值是个不定值（如果没有初始化的话），将t中的值给a明显错误。

user: user-0
content: 图二d中中间那个事b=a
user-0 提问: c求最大值

回复:
user: user-1
content: if(m=a[i]) n=i; //可以拆解为：①将a[i]赋值给m ②赋值成功（一般都会成功），则代码等同于if(true) n=i;赋值失败，代码等同于if(false) n=i;ture为1，false为0。所以你现在的问题是每次if都赋值成功，然后if后面的东西每次都执行  改为if(m==a[i]) n=i;//可以拆解为：①判断当前a[i]里面的值是否等于当前m里的值，m==a[i]和a[i]==m可以认为一样的  ②判定相等，则代码等同于if(true) n=i;判断不等于，代码等同于if(false) n=i;ture为1，false为0。

user: user-2
content: 同上。 写判断语句时要注意，如果你要写一个表达式，就要开始留心。表达式中的比较符基本上都是2个字符：==、！=、<=、>=、||、&&等。如果只写了一个，程序也不会报错，检查起来可能就比较费时间。所以在写判断语句时得留心了

user: user-3
content: if(m=a[i]) n=i; 这个判断语句改一下  if(m==a[i]) n=i; 注意赋值语句和判断语句的用法
user-0 提问:   求助啊！！   Codeblocks  ！

回复:
user: user-1
content: 网上有说，可以试下，可能是“下载的版本有问题，没有安装编译器；卸载之后，重新下载一个带有编译器的，在安装的时候选择安装编译器就可以了”
user-0 提问: CSV如何在最后一行新建一行并填入数据呢

回复:
user: user-1
content: 楼主，如果排查问题，可以先 1)先看看CsvFile文件打开是否成功，f_lseek，f_truncate函数操作是否成功？ 2)在写入完数据后，可以尝试一下关闭CsvFile文件，看看是否写入的数据还在缓存中，没有实际保存到文件中？ 3)判断一下，是否char *buff参数传进来的数据是否为空或者长度为0，如果是，写入的内容就是你之前的内容了？ 4)又或者单独在WCsvFile_Newndex函数中删除之前存在的文件，重新重建文件，重新写入数据，看是否成功？

user: user-2
content: lz这段代码是FatFS的函数吧。 建议lz关注下f_lseek，f_truncate这两个函数的返回值

user: user-0
content: 感谢各位大佬回答，我已经写出来了。。void WCsvFile_NewRowData(char *buff) { 	char *CsvMemory; 	 	u8 buffsize; 	u32 CsvMemorySize;//申请内存的尺寸 	 	buffsize = strlen(buff);//计算字符串 字符个数  	CsvMemorySize = CsvDataSize + buffsize;//计算申请内存的尺寸 	CsvMemory = mymalloc(SRAMEX,CsvMemorySize);//申请一段总内存 	if(CsvMemory == NULL) return;//申请不到数据 	memset(CsvMemory,0,CsvMemorySize); 	memcpy(CsvMemory,CsvDataSpace,CsvDataSize);			//把前一段内存拷贝进去 	memcpy(CsvMemory + CsvDataSize,buff,buffsize);//存入更改数据	 	f_lseek (CsvFile ,0);//指针移到文件开头 	f_truncate (CsvFile);//截断(清除)当前文件指针后的文件数据 避免数据坑余	 	f_write(CsvFile,CsvMemory,CsvMemorySize,&Csv_bw); //存入后一段数据  (整段新数据) 	myfree(SRAMEX,CsvDataSpace);//清空之前的申请旧数据的内存 	 	CsvDataSize = CsvMemorySize;//更新数据尺寸 	  	CsvDataSpace = CsvMemory;//更新数据,交换内存指向新数据地址  }  和昨天发的应该没大区别，是在别的函数影响下写入不正常
user-0 提问: 请教fgets()读取一个整数的“玄学”问题

回复:
user: user-1
content: void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-2
content: 667953 == 0xA3131 -858993460 == 0xCCCCCCCC VS是有选项的，可以控制调试时显示十进制还是十六进制。

user: user-0
content: 引用 1 楼 Saleayas 的回复:fget 把传入的整形数组当作字符串数组了，写入的是字符串的 "11" 加上0A 换行而已。 谢谢答复！也就是说我输入的是“11”，fgets()存储的是“11\n”，可因为我的数组设置成了int型不是char型，所以它存储的数据值就被转化成667953这样一个在计算机内部存储的整型数字，是吗？

user: user-0
content: 谢谢答复！也就是说我输入的是“11”，fgets()存储的是“11\n”，可因为我的数组设置成了int型不是char型，所以它存储的数据值就被转化成667953这样一个在计算机内部存储的整型数字，是吗？

user: user-3
content: fget 把传入的整形数组当作字符串数组了，写入的是字符串的 "11" 加上0A 换行而已。

user: user-0
content: 引用 4 楼 qq_38319117 的回复:fgets的默认参数是char*，你现在写的a是一个int*，有的编译器编译不过去的，会报错，原理上就是个强转 等同 fgets((char*)a, MAX,stdin);  键盘输11,在fgets看来，就是  新行'1''1'  即0x0a 0x31 0x31 然后把它放到一个四字节的int里，就变成0x0a3131，解成十进制就是667953  谢谢答复！你这样一说我就全明白了。但是我想fgets()处理的应该还是"11\n"，但是估计用的是小端存放方式，所以计算成0x0a 0x31 0x31。 再说一句：非常感谢。

user: user-4
content: fgets的默认参数是char*，你现在写的a是一个int*，有的编译器编译不过去的，会报错，原理上就是个强转 等同 fgets((char*)a, MAX,stdin);  键盘输11,在fgets看来，就是  新行'1''1'  即0x0a 0x31 0x31 然后把它放到一个四字节的int里，就变成0x0a3131，解成十进制就是667953
user-0 提问: 如图a小于b时   后面一部分怎么理解

回复:
user: user-1
content: 要从小到大排序，ab要调换位置； 用一个t作为中转站。

user: user-2
content: （if）如果a<b成立的话，那么就将a的值与b的值进行调换。但我们知道这种换值是需要第三个变量来帮助我们实现的，否则在赋值的过程中会出现值丢失的情况，通过图中代码可看出，先将a的值给t（第三个变量），再将b的值给a，最后将t的值给b。这样就实现了两个数值的调换。

user: user-3
content: if中实现的功能是a<b时，交换a和b的值，即如果a=4,b=20,执行完if后变为a=20,b=4  但是要交换a和b的值，不能直接a=b;b=a; 因为a=b的时候，a原本的值会被b的值覆盖，这时执行b=a时，a的值是刚刚b赋给a的，所以需要一个中间量t先把a的值存起来，在b的值交给a后，再把t中存的a的值交给b

user: user-4
content: 后面是实现a、b之间数值的交换；先将a的值赋给t保存起来，再将b的值赋给a，最后将t里面保存的a的值赋给b

user: user-5
content: 后面再来一行 a > c ? printf("%d", a) : printf("%d", c); 就能达成目标了。

user: user-6
content: 1、先把变量a的值赋予t  t=a;  此时t的值等于a； 2、将变量b的值赋予a   a=b；  此时a的值等于b； 3、最后将变量a的值赋予b； 上面a的值已经等于b了，此时就需要借助中间变量t，t的值等于a；那么就有 b=t；

user: user-7
content: 说错了是从大到小

user: user-7
content: a小于b时，由于要从小到大排序，ab要调换位置； 这时如果用a=b;b=a;来的话就会出现问题（a的值已替换为b，而之前的a的值已经不复存在，传给b的也还是b之前的值。） 所以要t=a;a=b;b=t;这样来写。先把a的值传给t保存，然后把b的值给a，最后b从t这个中间变量中取出a的值给自己，就实现了a和b的位置调换

user: user-8
content: 楼主，按照你代码中的说明，是应该判断三个数哪个大，然后再打印最大值，从你给出的代码来看，你上面说的回复是正确的，应该缺少一些代码呢~~~~没有实现功能。

user: user-9
content: 想问一下楼主，程序就这么多吗？我认为这段代码只能判断出来ab的大小并按照从大到小排列，只有输入，还没有输出，还没有和c进行比较判断。 当a<b时，把a给t，b给a（大的给a），再把t给b（小的给b）。就是用了个中间变量交换了一下位置！ 所以从目前这段代码我认为就只能看出来这么多了吧，希望能对你有用。

user: user-7
content: 很经典的入门问题..网上资料很多

user: user-10
content: 当a<b时，后面的部分是交换a和b内存空间的值。t是中间变量
user-0 提问: 0x0F8AD3EC (ucrtbased.dll)处(位于 Not.exe 中)引发的异常: 0xC0000005: 写入位置 0x00900000 时发生访

回复:
user: user-1
content: scanf_s("%s", cha, 30); 对于%s而言，楼主的是缺少一个参数，即字符数组的长度～

user: user-2
content: 犯了类似错误 我来挖个fen。。。 scanf_s("%s", cha); 这里少了&这个  取地址符号！！加上就好了！

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

user: user-4
content: 逗号写错了 #include<stdio.h>   int main() { char cha[30]; scanf_s("%s", cha,20);   printf("%s", cha);   system("pause"); return 0; }

user: user-4
content: #include<stdio.h>  int main() { char cha[30]; scanf_s("%s", cha，20);  printf("%s", cha);  system("pause"); return 0; }看一下scanf_s的用法

user: user-0
content: 是的，VS2017

user: user-5
content: 楼主，应该是下面的用法才对：  #include<stdio.h> int main() { 	char cha[30] = { 0 }; 	scanf_s("%29s", cha, (unsigned)_countof(cha));  	printf("----\n%s", cha); 	system("pause"); 	return 0; }  出现你上面的错误，应该是访问内存越界了吧。。。

user: user-6
content: 首先scanf_s是VS专用，你的编译器是VS吗

user: user-0
content: 我知道了，VS下scanf_s的用法不一样，在输入字符串时需要有其长度参数