Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 数组越界问题

回复:
user: user-1
content: 第二个没问题，第一个越界了，因为字符串最后还有\0，至少是：char str[8]=“FORTRAN”，当然你可以写成：char str[]=“FORTRAN”，这样编译器根据初始值推测大小（自动得到8）

user: user-2
content: char str[7]=“FORTRAN”越界， char str[]={'F','O','R','T','R','A','N',0}只要赋值正确不存在越界一说，可以用sizeof（str）看一下它的长度

user: user-3
content: 第一个肯定越界了，因为字符串后面还有一个'\0'. 第二个是没有问题的，因为定义数组的时候并没有指定长度，实际数组长度会自动定义为8

user: user-4
content: 字符串后面都会有一个\0跟着算一个字符，例如你定义一个char a[7]那么你要把最后一个空间留给\0。
user-0 提问: 为什么会出现这个错误？

回复:
user: user-1
content: hero.c没有一个函数定义，都是定义的全局变量，与其这样不如将hero.c文件删除，将hero.c中的全局变量定义全放在main.c中的头部（头文件之后，main函数之前）； 一般定义.c文件，就是用于定义函数的，但是一个函数定义没有。另外，全局变量一般会放在要用的源文件前面部分。比如main函数之前。

user: user-2
content: extern Hero heros[100]; 改成extern Hero heros[1]; 或者 Hero heros[] = { 改成 Hero heros[100] = {

user: user-3
content: 你的代码没有太大问题 你用的是什么编译器？

user: user-3
content: 应该是没有把hero.cpp 引入到项目中！

user: user-4
content: 引用 1 楼 ai977313677 的回复:Hero.h 文件为： #ifndef HERO_H_INCLUDED #define HERO_H_INCLUDED  typedef struct _myTime {     int year;     int month;     int day; }MyTime; typedef struct _hero {     char name[50];     char sex;     char job[20];     int life;     double speed;     char abillity[20];     MyTime pubTime;  }Hero;  #endif // HERO_H_INCLUDED Hero.c文件为： #include "Hero.h" Hero heros[] = {     {"影流之猪姐",'m',"刺客",579,0.644,"位移",{2012,8,15}}  }; main.c文件为： #include <stdio.h> #include <stdlib.h> #include "Hero.c" extern Hero heros; int main() {     printf("%s\n",heros[0].name);     return 0; } 改了main.c的包含，就是extern这个关键字的作用你没弄清而已

user: user-4
content: Hero.h 文件为： #ifndef HERO_H_INCLUDED #define HERO_H_INCLUDED  typedef struct _myTime {     int year;     int month;     int day; }MyTime; typedef struct _hero {     char name[50];     char sex;     char job[20];     int life;     double speed;     char abillity[20];     MyTime pubTime;  }Hero;  #endif // HERO_H_INCLUDED Hero.c文件为： #include "Hero.h" Hero heros[] = {     {"影流之猪姐",'m',"刺客",579,0.644,"位移",{2012,8,15}}  }; main.c文件为： #include <stdio.h> #include <stdlib.h> #include "Hero.c" extern Hero heros; int main() {     printf("%s\n",heros[0].name);     return 0; }
user-0 提问: 求助：exe 已触发了一个断点，有未经处理的异常: 0xC0000374: 堆已损坏。 (参数: 0x77614270)。

回复:
user: user-1
content: while (tempstr[x]) ==》  while (str[y]!='\0')

user: user-1
content: 在change函数里，对tempstr 操作越界了！

user: user-2
content: 你访问堆内存越界了，可以单步跟踪程序运行查看

user: user-0
content: 谢谢指导，明白了

user: user-3
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  char* change(char *str) {     char *tempstr = (char *)malloc(strlen(str) + 1);     //memset(tempstr, 0, sizeof(str) + 1);     int i = 0, j = 0;     char ascii_1, ascii_2;     while (str[i])     {         printf("%c\n", str[i]);         if (str[i] == '%') {             if (str[i+1] >= 'A')                 ascii_1 = str[i+1] - 'A';             else                 ascii_1 = str[i+1] - '0';              if (str[i+2] >= 'A')                 ascii_2 = str[i+2] - 'A';             else                 ascii_2 = str[i+2] - '0';              tempstr[j] = ascii_1 * 16 + ascii_2;             i += 2;             j++;         } else {             i++;         }         /*         if ((tempstr[x] = str[y]) == '%')         {             if (str[y + 1] >= 'A')             {                 ascii_1 = str[y + 1] - 55;              }             else             {                 ascii_1 = str[y + 1] - 48;             }             if (str[y + 2] >= 'A')             {                 ascii_2 = str[y + 2] - 55;              }             else             {                 ascii_2 = str[y + 2] - 48;              }             tempstr[x] = ascii_1 * 16 + ascii_2;             y++;         }         x++;         */      }     /*printf("x=%d\n", x);       printf("y=%d\n", y);*/     tempstr[j] = '\0';      //printf("%s\n", tempstr);       return tempstr;  }   int main() {     char str[128] = "%D6%DC%C8%BA%BA%A3";      printf("%s", change(str));     system("pause");      return 0; } 参考一下吧
user-0 提问: tcp大文件传输，全部write成功，read接收到部分后阻塞 

回复:
user: user-1
content: 你 write 都没检查人发送了几个字节， 这能不出错么，  发送的字节数是有可能小于你需要发送的 ...

user: user-2
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

user: user-3
content: 引用 4 楼 user-4 的回复:试试在结构体加个字符缩进，保持一个字节对齐，然后试试把整形的转化为网络序试试 小文件传输没问题，那么应该跟你提出的这个可能没关系。

user: user-4
content: 试试在结构体加个字符缩进，保持一个字节对齐，然后试试把整形的转化为网络序试试

user: user-3
content: 引用 2 楼 ReturningProdigal 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 贴出你的代码，如果小文件没问题，那么建议在write端加一些延迟，每次发完一个包之后，都加一些延迟。怀疑是接收端没有来得及接收，导致部分数据丢失。加延迟是保证read端都能将每个网络包接收到。当然，加延迟会导致发送文件时间边长，另一种办法就是read端用环形缓冲区接收。  //传输数据结构体 typedef struct ResponeBody{ 	int packindex;//4 byte 	char type;//2 byte 	char status;//2 byte 	int datalen;//4 byte 	int datatotal;//4 byte 	char s_arg[24];//24 byte 	char data[SIZE_DATA]; }ResponeBody;   //发送端 while((num = read(fd, resp.data, SIZE_DATA)) > 0) { 	resp.type = getData; 	resp.status = 1; 	resp.datalen = num; 	res = my_write(socket, &resp, SIZE_RESP); 	if(res < 0){ 		return -1; 	} 	memset(&resp, 0, SIZE_RESP); } close(fd);   //读取数据 int ret = -1; while(1){ 	num = read(socket, &resp, SIZE_RESP); 	if(num <= 0 || len_recv >= datatotal){ 		printf("get success\n"); 		ret = 0; 		break; 	} 	if(0 == resp.status || resp.type != getData){ 		ret = -1; 		break; 	} 	write(fd, resp.data, resp.datalen); 	len_recv += num-SIZE_INFO; 	printf("get ----[%2.2f%%]----\n", len_recv/(double)datatotal * 100); 	memset(&resp, 0, SIZE_RESP); } [/quote] 怀疑是读取端没有即使将数据接收，导致数据包丢失。

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:贴出你的代码，如果小文件没问题，那么建议在write端加一些延迟，每次发完一个包之后，都加一些延迟。怀疑是接收端没有来得及接收，导致部分数据丢失。加延迟是保证read端都能将每个网络包接收到。当然，加延迟会导致发送文件时间边长，另一种办法就是read端用环形缓冲区接收。  //传输数据结构体 typedef struct ResponeBody{ 	int packindex;//4 byte 	char type;//2 byte 	char status;//2 byte 	int datalen;//4 byte 	int datatotal;//4 byte 	char s_arg[24];//24 byte 	char data[SIZE_DATA]; }ResponeBody;   //发送端 while((num = read(fd, resp.data, SIZE_DATA)) > 0) { 	resp.type = getData; 	resp.status = 1; 	resp.datalen = num; 	res = my_write(socket, &resp, SIZE_RESP); 	if(res < 0){ 		return -1; 	} 	memset(&resp, 0, SIZE_RESP); } close(fd);   //读取数据 int ret = -1; while(1){ 	num = read(socket, &resp, SIZE_RESP); 	if(num <= 0 || len_recv >= datatotal){ 		printf("get success\n"); 		ret = 0; 		break; 	} 	if(0 == resp.status || resp.type != getData){ 		ret = -1; 		break; 	} 	write(fd, resp.data, resp.datalen); 	len_recv += num-SIZE_INFO; 	printf("get ----[%2.2f%%]----\n", len_recv/(double)datatotal * 100); 	memset(&resp, 0, SIZE_RESP); }

user: user-3
content: 贴出你的代码，如果小文件没问题，那么建议在write端加一些延迟，每次发完一个包之后，都加一些延迟。怀疑是接收端没有来得及接收，导致部分数据丢失。加延迟是保证read端都能将每个网络包接收到。当然，加延迟会导致发送文件时间边长，另一种办法就是read端用环形缓冲区接收。
user-0 提问: 各位大佬老师们，请问如何定义unsigned  无类型变量

回复:
user: user-0
content: 引用 1 楼 cfjtaishan 的回复:参数类型不对了，如果是中文字，不能只是unsigned char了，建议用wchar 库给的函数定义的确只有unsigned 。。不过wchar_t类型应该可以，，正在改改，，谢谢了~~~

user: user-1
content: 参数类型不对了，如果是中文字，不能只是unsigned char了，建议用wchar
user-0 提问: 宏使用的问题  比如：#define  (a,b,c,d)

回复:
user: user-1
content: 引用 11 楼 paschen 的回复:引用 5 楼 li_rui_1220 的回复:这是LWIP代码中的，实际代码如下：#define sys_thread_new(n,t,a,s,p)就是你无论输入什么参数，都替换为空，意义取决于你程序，可能在某些情况下替换为空，在某些情况下替换为别的 引用 9 楼 zhao4zhong1 的回复:VS IDE中，在不明白的符号上点鼠标右键，选转到定义和查找所有引用。 理解和讨论之前请先学会如何观察！

user: user-2
content: 这一般是调试用，或者跨平台代码用的。 1. 调试#ifdef _DEBUG #define DebugPrint(x) cout << x << endl #ele #define DebugPrint(x) #endif代码中调用 DebugPrint 时，在调试版本的时候打出一些信息，正式版本可能只被替换为空，也就是一个分号。 2. 跨平台 如果你要封装一种库，比如网络库，界面库等。但有的时候，某个平台需要做一些额外操作，而另外一个平台不需要的时候，就会根据不同平台定义不同的宏，其中的一个平台这个宏被替换为空或 0 等。比如 Windows 平台的网络库需要调用 WSAStartup 加载 Windows Socket 库并使用 WSACleanup() 关闭，而 Linux 下不需要。这样有些开发者会定义一个通用的宏，作用是启动网络库。当系统为 Linux 时，定义为空，不作任何操作。

user: user-3
content: 引用 5 楼 li_rui_1220 的回复:这是LWIP代码中的，实际代码如下：#define sys_thread_new(n,t,a,s,p)就是你无论输入什么参数，都替换为空，意义取决于你程序，可能在某些情况下替换为空，在某些情况下替换为别的

user: user-4
content: C++里好像就少用到宏替换

user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义和查找所有引用。

user: user-5
content: 引用 7 楼 li_rui_1220 的回复:[quote=引用 6 楼 hdt 的回复:] 宏就是替换 比如 #define max(x,y) x>y?x:y z = max(3,1); 替换为 z = 3>1?3:1; 以这段代码来看 #define sys_thread_new(n,t,a,s,p)  就是把sys_thread_new(....) 替换为空 存在的意义呢？[/quote] 你的意义指什么？没有上下文，何谈意义？

user: user-0
content: 引用 6 楼 hdt 的回复:宏就是替换 比如 #define max(x,y) x>y?x:y z = max(3,1); 替换为 z = 3>1?3:1; 以这段代码来看 #define sys_thread_new(n,t,a,s,p)  就是把sys_thread_new(....) 替换为空 存在的意义呢？

user: user-5
content: 宏就是替换 比如 #define max(x,y) x>y?x:y z = max(3,1); 替换为 z = 3>1?3:1; 以这段代码来看 #define sys_thread_new(n,t,a,s,p)  就是把sys_thread_new(....) 替换为空

user: user-0
content: 这是LWIP代码中的，实际代码如下：#define sys_thread_new(n,t,a,s,p)

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:要看这个是用在什么环境里的。 这个宏定义里面会设计到逗号运算符。相当于#define (d) 这是LWIP代码中的，实际代码如下：#define sys_thread_new(n,t,a,s,p)

user: user-6
content: 要看这个是用在什么环境里的。 这个宏定义里面会设计到逗号运算符。相当于#define (d)

user: user-7
content: 代码会直接报错误

user: user-3
content: 没有#define (a,b,c,d)这种语法呢
user-0 提问: C语言链表节点删除问题

回复:
user: user-1
content: 老哥这个代码里面都是些低级错误呀，student写成了stduent，p写成了p1

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

user: user-3
content: #include<stdio.h> #include<stdlib.h> #include<malloc.h>  #define LEN sizeof(struct student)  struct student {     int num;     char name[20];     char sex;     int ages;     struct student *next; };  int n;  struct student *creat() {     struct student *head,*p1,*p2;     head = NULL;     p1 = p2 = (struct student *)malloc(LEN);     scanf("%d%s %c%d", &p1->num,p1->name,&p1->sex,&p1->ages);     while(p1->num!=0)     {         n=n+1;         if(n==1)             head = p1;         else             p2->next=p1;         p2 = p1;         p1 = (struct student *)malloc(LEN);         scanf("%d%s %c%d", &p1->num,p1->name,&p1->sex,&p1->ages);     }     free(p1);    /* free not used node */     p2->next = NULL;      return(head); }  struct student *cancel(struct student *phead) {     int getage;     struct student *prev,*pcur;      scanf("%d", &getage);      if (phead->ages == getage) {         prev = phead;         phead = phead->next;         free(prev);         return phead;     }      prev = phead;     pcur = phead->next;     while (pcur) {         if (pcur->ages == getage) {             prev->next = pcur->next;             free(pcur);             return phead;         }         prev = pcur;         pcur = pcur->next;     }      return phead;      /*      while(p1!=0)  //p1是p2前面的表头     {         if(p1->ages==getage)         {             if(head==p1)                 head=p1->next;             else                 p2->next=p1->next;             p1=p1->next;         }         else         {             p2=p1;             p1=p1->next;         }     }     */ }  void print(struct student *phead) {     struct student *p = phead;     while(p)     {         printf("%-5d %-8s %c %2d\n",p->num,p->name,p->sex,p->ages);         p = p->next;     } }  //void main() int main() {     struct student *head;     head = creat();     print(head);     head = cancel(head);     print(head); }  参考一下吧

user: user-0
content: 初始化为NULL没用呐

user: user-4
content: 一个习惯吧，试试给你定义的指针初始化为NULL试试
user-0 提问: 怎么用一个公式（数学简写公式）表示aij (1≤i≤x,1≤j≤y) 每行的方差

回复:
user: user-1
content: 建议将需求说明白了，另外对于这类问题，建议还是自己先写一写，遇到问题再提出来。

user: user-2
content: 百度搜相关关键字。
user-0 提问: printf的实现在哪

回复:
user: user-1
content: C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c

user: user-2
content: printf是C语言库函数，它的实现若是找源码，需要找库的实现源码；如果是调用位置，应该是以动态库的形式存在的。基本的动态库。

user: user-0
content: 应该是在msvcrtd.lib里面，还是编译成静态代码了。 另外我在网上找到一篇文章：http://tieba.baidu.com/p/1883427237 。文章里提到的这个输入表窗口是怎么打开的？

user: user-3
content: VS安装目录\VC\crt\src

user: user-4
content: 引用 3 楼 陪妳看星星的回复:不是问printf源码怎么实现的，是问源码编译后的东西(obj、lib、dll)在哪？ 没研究过那个，不过仔细想想，你即然有了源码，干吗要编译进dll,lib

user: user-0
content: 我的编译选项是/MDd，不是静态编译。

user: user-0
content: 引用 2 楼 user-5 的回复:可能编译成静态代码了 我倒觉得可能是depends有问题，没有显示全

user: user-0
content: 不是问printf源码怎么实现的，是问源码编译后的东西(obj、lib、dll)在哪？

user: user-5
content: 你可以拿我写的这个工具查看： http://download.csdn.net/download/user-5/9428733  具体描述可看：http://blog.csdn.net/user-5/article/details/50640421

user: user-5
content: printf里实际调用的好像是_vfprintf，后者又调用__stdio_common_vsprintf

user: user-5
content: 可能编译成静态代码了

user: user-4
content: 建议研究一下，dll和lib的区别！
user-0 提问: 求出错地方

回复:
user: user-1
content: 仅供参考：//假设有n个人团团围做，从第1个人开始数数，数到第m个人时候，第m个人出列， //然后继续从1开始数数，数到第m个人退出 #include <stdio.h> #include <conio.h> int i,k,t; int n,m; static char f[1001];//0该座位未出圈,1该座位已出圈 void main() {     while (1) {         printf("Input n m(1000>=n>=m>=1):");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1000>=n && n>=m && m>=1) break;         }     }     t=0;//已出圈总人数     i=1;//座位编号     k=1;//当前要数的数     while (1) {         if (0==f[i]) {             if (m==k) {                 t++;                 f[i]=1;                 printf("%3d ",i);                 if (0==t%10) printf("\n");                 if (t>=n) break;             }             k++;if (k>m) k=1;         }         i++;if (i>n) i=1;     }     cprintf("Press any key ...");     getch(); }

user: user-2
content: while(1)內第一个for循环內应使用break跳出该循环，否则数组被全部置为0

user: user-3
content: 你的变量p没有赋初始值

user: user-1
content: 引用 3 楼 LoveMyTail 的回复:这样子看的真是头疼 astyle自动整理c,c++,java源代码格式命令行工具源代码。 用astyle --help查看使用帮助。 http://download.csdn.net/detail/zhao4zhong1/5605415

user: user-4
content: 这样子看的真是头疼

user: user-5
content: 约瑟夫环的问题，用数组模拟约瑟夫环。  #include <stdio.h> #include <stdlib.h>  #define MAX_SIZE    50  void init_arr(int *arr, int len); void joseph(int *arr, int len, int key);  int main(void) {     int arr[MAX_SIZE];      init_arr(arr, MAX_SIZE);     joseph(arr, MAX_SIZE, 3);     printf("Last no is %d\n", arr[0]);      return 0; }  void init_arr(int *arr, int len) {     int i;      for (i = 0; i < len; i++)         arr[i] = i + 1; }  void joseph(int *arr, int len, int key) {     int i, j = 0, k;     int cnt = len;      for (i = 1; cnt > 1; i++, j++) {         if (j == cnt)             j = j % cnt;         if (i % key == 0) {             for (k = j; k < cnt; k++)                 arr[k] = arr[k + 1];             cnt--;             j--;         }     } } 参考一下吧

user: user-0
content: 有50个人围成一圈，顺序排号。从第一个人开始报数（从1到3报数），凡报到3的人退出圈子，问最后留下的是原来第几号的那位
user-0 提问: 求大佬回答问题--------一个正在学编程c语言的小萌新（大一）

回复:
user: user-1
content: 引用 4 楼 cfjtaishan 的回复:获取函数处理之后的数据，有两种方法可以得到，一个是直接定义函数返回值，若是返回多个数据，可以考虑返回结构体；另一种方法就是通过传入传出参数；若有多个数据，则考虑传入传出参数使用结构体类型。传入传出参数即传递main函数里的变量的地址到指定函数的形参； 当然也可以有第三种方式，就是全局变量，但是这个不推荐使用。如果能用前两种尽量使用前两种方法，第三种方法主要考虑全局变量多了，不好维护

user: user-1
content: 获取函数处理之后的数据，有两种方法可以得到，一个是直接定义函数返回值，若是返回多个数据，可以考虑返回结构体；另一种方法就是通过传入传出参数；若有多个数据，则考虑传入传出参数使用结构体类型。传入传出参数即传递main函数里的变量的地址到指定函数的形参；

user: user-2
content: 学习了，指针也可以传入一个结构指针

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

user: user-4
content: 非常有用，感谢！！

user: user-5
content: 传入一个指针，lpParameter参数存储你的计算结果
user-0 提问: 在C语言中如何计算相对分子质量，求思路？

回复:
user: user-1
content: 用一个指针指向分子式，每次读一个字节，与ACSII比较，如果为字母就放在一边，对比元素分子量枚举表，得到分子量，在读数字放在一个数组中，可能为两位数，然后atoi转成INT，类推算出分子量，可能有点复杂，这是我的想法

user: user-2
content: 把语言先学好吧，计算其实非常简单！

user: user-3
content: struct｛char 原子名称  int 原子质量 int 原子个数｝ 再定义一个结构体数组。。。

user: user-4
content: 正则表达式是最优的处理方式。另外只能用isalpha和isdigit来切割了，每一组的格式都是元素加元素原子个数
user-0 提问: [求助] int a (int b) ;是什么意思？

回复:
user: user-1
content: 头一会见,刚试了下,就是回调函数 可以写成int a(int b(int)),就更容易理解了 我还是太无知了

user: user-2
content: int a(int b)  a是函数名  b是a的整型实参

user: user-3
content: 第二种正确的书写应该是：int a(int (*b)(int  c));声明一个函数 a，参数为指向参数为 int 且返回值为 int 的函数的指针。如下面第一个函数就是符合该参数要求原型的函数。int func1(int  c);           // 可简写为 int func1(int); int func2(int (*b)(int  c)); // 可简写为 int func2(int (*)(int));比如上述两个例子函数 func1（指针）可以作为 func2 的参数。上述两个函数可以以如下方式调用：int res = func2(&func1);

user: user-4
content: int a ( in b ) 很好理解嘛   返回值为 int 类型的函数 参数为int 类型的形参  至于 第二个 int a (int b ( int  c ))  就是多一层嵌套  不过没见过这种东西  还是学的比较少

user: user-3
content: int main(int argc, char *argv); VS int a(int b); VS int abs(int n); 函数声明没见过吗？

user: user-5
content: 引用 5 楼 cfjtaishan 的回复:应该是连个函数，从外向内依次是函数a，返回值int类型，参数类型是int类型(因为函数b的返回值是int类型），参数个数为1个；函数b返回值的是int类型，参数是int类型，参数个数为1个。 我感觉还是这种方法好

user: user-6
content: int //表示整数输入，所以。。。

user: user-7
content: 应该是连个函数，从外向内依次是函数a，返回值int类型，参数类型是int类型(因为函数b的返回值是int类型），参数个数为1个；函数b返回值的是int类型，参数是int类型，参数个数为1个。

user: user-8
content: 理解和讨论之前请先学会如何观察！ //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-9
content: int a (int b (int c)) ;没有遇到过，现在学习了

user: user-10
content: int a (int b (int c))，这个应该比较好理解，分解了看就可以，我觉得是这样的哈，函数a接收一个int的参数，返回值类型为int，参数为一个接收一个int参数，返回值类型为整形的函数

user: user-11
content: 定义一个返回值为整型的函数a，a的形参是一个返回值为整型的函数b，b的形参为一个整形变量。

user: user-12
content: int a (int b); // 声明一个形参是int，返回类型是int的函数  int a (int b (int c)) ; // 声明一个形参是int(int)（函数类型，作形参时会退化成函数指针），返回int的函数。
user-0 提问: 引发了未经处理的异常:读取访问权限冲突。 **t** 是 0xCE1AC0D6。 出现了 

回复:
user: user-1
content: #include<stdio.h> #include<string.h>  typedef char DataType;  void GetNext(DataType* t, int* next, int tlength) {     int i = 1, j = 0;     next[1] = 0;     while (i < tlength)     {         if (j == 0 || t[i] == t[j])         {             ++i;             ++j;             next[i] = j;             printf("i = %d, next[%d] = %d\n", i, i, next[i]);         }         else         {             j = next[j];             printf("++++%d\n", j);         }         printf("i = %d\n", i);     } }  int IndexKmp(DataType *s, DataType *t, int pos, int tlength, int slength, int *next) {     int i = pos, j = 1;      while (i <= slength&&j <= tlength)     {         if (j == 0 || t[j]==s[i])         {             i++;             j++;         }         else {             j = next[i];             printf("****i = %d,  %d\n", i, j);         }      }     if (j > tlength)         return i - tlength;     else         return 0; }  int main() {     int locate, tlength, slength, next[256];     DataType s[256], t[256];     printf("输入主串:\n");     scanf("%s", s);     slength = strlen(s);     printf("输入子串:\n");     scanf("%s", t);     tlength = strlen(t);     GetNext(t, next, tlength);     locate = IndexKmp(s, t, 0, tlength, slength, next);     printf("匹配位置:%d\n", locate);     return 0; }   代码逻辑有问题，GetNext函数会将下标为1， 2， 3.。。设置为1，但是下标为0的为随机数； 当进入IndexKmp函数时，初始化j = 1;那么循环中j == 0就不会运行。所以直接是j = next[i];此时i为0，跳出循环；

user: user-2
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-3
content: 出错时中断下来，通过调用堆栈定位到相关位置，分析原因，你IndexKmp函数中，next[i]没初始，j赋值后是一个未初始的值，之后访问t[j]导致出错

user: user-4
content: 你确定你的程序可以编译吗？ #include<stdio,h> //是点，不是逗号 #include<string,h>
user-0 提问: 新手求教 C++算牛顿二乘法的根出现的问题

回复:
user: user-1
content: 牛顿迭代法公式“ X(n+1)=X(n)-F'(Xn)/F"(Xn) 你的代码迭代公式不对

user: user-1
content: [code=c] [#include<iostream.h> void main() { using namespace std; float x,x0,f,f1f2; x=1; do { x0=x; f=x*x*x*x*x-3*x*x+1; f1=5*x*x*x*x-6*x; f2=5*4*x*x*x-6 x=x0-f1/f2; }while(x-x0<0.000001); cout<<"x="<<x<<endl; }/code]

user: user-2
content: 稍微改进一下：     if (f1 == 0) x = x0 - (f + 0.0000001) / (f1 + 0.0000001);     else x = x0 - f / f1; 说到底是你用的这公式造成的，也就这样了。

user: user-0
content: x = x0 - f / (f1 + 0.0000001); 改成这样后X=1.14286e+006 这是赋值上的问题吗

user: user-2
content: 引用 3 楼 qq_41580767 的回复:请问一下应该怎么改呢？ 我之前用int定义的话 会出现我的cpp运行的时候会停止运行 但是用float double的话又什么结果都没有输出出来……  这应该是你用的公式导致的，可以把 x=x0-f/f1; 改成 x = x0 - f / (f1 + 0.0000001); 试试

user: user-3
content: 自己要把算法逻辑理清楚，必要时单步跟踪程序运行，观察程序流程及变量变化情况

user: user-0
content: 请问一下应该怎么改呢？ 我之前用int定义的话 会出现我的cpp运行的时候会停止运行 但是用float double的话又什么结果都没有输出出来……

user: user-2
content: 第二次迭代的时候f1就成0了，所以 x=x0-f/f1;这里就出现除以0异常。

user: user-4
content: 如果没有输出任何东西，就是算法有问题，造成了死循环
user-0 提问: (紧急求助)free字符串的时候报错

回复:
user: user-1
content: 錯不在free，而在strcpy

user: user-2
content: char * str = (char *)malloc(sizeof(char) * 128); 原因如楼上所述！

user: user-3
content: 看代码应该不是释放free的问题，而是strcpy越界导致的。  malloc申请了1个字节的空间，但是要拷贝远远大于1的字符串到str中，很明显越界了。
user-0 提问: 二进制转１０进制 为什么调用函数　传数组老是出错　编译不成功

回复:
user: user-1
content: zh函数需要的参数是char*，你的变量a是char类型，不匹配  改成：  char a[100]; printf("please input 1001 number "); scanf_s("%s", a, 100);

user: user-2
content: #include <stdio.h> #include <string.h> int zh(char str[]) {     int sum = 0;/*定义总值*/     int j = 1;/*交换数值*/     int pot = strlen(str) - 1;/*把str数组值先减一*/     for (; pot >= 0; pot--) /*循环　pot值　每次减一*/     {         sum += (str[pot] - '0')*j;         j*=2;/*每次j都乘２*/     }     return sum; } int main() {     int result;     char a[32];      printf("please input 1001 number ");     scanf_s("%s",a, 32);     result= zh(a);     printf("thit is number %d\n",result);     return 0; } 参考一下吧

user: user-3
content: 数组做参数，应该传递数组首地址

user: user-4
content: 字符串转数字，不需要从末尾开始扫描，从头开始就行了：int zh(const char * restrict str) { 	int sum = 0; 	while (*str != 0) 	{ 		char c = *str++; 		if (c < '0' || c > '1') 		{ 			break; 		} 		sum <<= 1; 		sum |= c - '0'; 	} 	return sum; }实在不明白从末尾扫描的优势，如果中间夹杂着不合法字符怎么办？比如字符串 "13579" 转换数字：13579 => sum = sum * 10 + ('1' - '0');  ^ 13579 => sum = sum * 10 + ('3' - '0');   ^ 13579 => sum = sum * 10 + ('5' - '0');    ^ 13579 => sum = sum * 10 + ('7' - '0');     ^ 13579 => sum = sum * 10 + ('9' - '0');      ^这种情况的话，从做到右扫描，遇到第一个不合法字符即可直接终止计算。

user: user-5
content: 这个c 币怎么赚的
user-0 提问: 关于随机函数的问题，求教。

回复:
user: user-1
content: C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c /*** *rand.c - random number generator * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines rand(), srand() - random number generator * *******************************************************************************/  #include <cruntime.h> #include <mtdll.h> #include <stddef.h> #include <stdlib.h>  /*** *void srand(seed) - seed the random number generator * *Purpose: *       Seeds the random number generator with the int given.  Adapted from the *       BASIC random number generator. * *Entry: *       unsigned seed - seed to seed rand # generator with * *Exit: *       None. * *Exceptions: * *******************************************************************************/  void __cdecl srand (         unsigned int seed         ) {         _getptd()->_holdrand = (unsigned long)seed; }   /*** *int rand() - returns a random number * *Purpose: *       returns a pseudo-random number 0 through 32767. * *Entry: *       None. * *Exit: *       Returns a pseudo-random number 0 through 32767. * *Exceptions: * *******************************************************************************/  int __cdecl rand (         void         ) {         _ptiddata ptd = _getptd();          return( ((ptd->_holdrand = ptd->_holdrand * 214013L             + 2531011L) >> 16) & 0x7fff ); }

user: user-2
content: http://zh.cppreference.com/w/cpp/numeric/random/rand http://zh.cppreference.com/w/cpp/numeric/random/srand  请将上面两个链接的内容完整地读一下，并注意这句话——每次以同一 seed 播种 rand() 时，它必须产生相同的值数列。

user: user-3
content: srand只是初始化随机数种子，一般运行一次就可以了，可以在程序开始时运行，或者第一次需要随机数的时候运行  http://en.cppreference.com/w/c/numeric/random/srand
user-0 提问: code::blocks编译器中，printf函数总是出现乱码

回复:
user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

user: user-2
content: CB默认 utf-8 ，控制台默认 gbk 所以要贴图看看具体什么情况

user: user-3
content: 控制台下输入chcp看一下当前代码页是多少，chcp 936改成中文。

user: user-4
content: 查看一下你包含代码的这个文件编码格式是不是和控制台 的编码格式不相符 或者是修改一下解决方案的编码格式

user: user-0
content: 不知道呀，有没有解决办法呀？

user: user-5
content: 中文乱码? 控制台编码问题么
user-0 提问: 这道题时间超限不知道怎么处理,哪位大佬帮看下,求解!?

回复:
user: user-1
content: 有一种恶心的算法，将1000000以内的所有质数列出到一个数组中，然后在这个数组中查询，而不是去针对每一个数字计算它是不是质数。因为isPrime太耗费时间了

user: user-0
content: 是wrong answer

user: user-0
content: 编译没有通过。谢谢了。

user: user-2
content: 试试下列代码：  #include <stdio.h>  // 此算法摘自百度百科词条“质数” bool isPrime(unsigned long n) { 	if (n <= 3) { 		return n > 1; 	} 	else if (n % 2 == 0 || n % 3 == 0) { 		return false; 	} 	else { 		for (unsigned short i = 5; i * i <= n; i += 6) { 			if (n % i == 0 || n % (i + 2) == 0) { 				return false; 			} 		} 		return true; 	} }  int main() { 	int n, p, q; 	if (scanf("%d", &n) != 1 || n <= 2) { 		printf("输入错误。"); 		return 0; 	}  	for (p = 1; p <= n / 2; p++) { 		q = n - p; 		if (isPrime(q) && isPrime(p)) { 			printf("%d, %d\n", p, q); 			return 0; 		} 	}  	printf("不能找到两个质数P和Q满足P<=Q并且P+Q=N\n");  	return 0; }
user-0 提问: 关于WaitForMultipleObjects的一个疑问

回复:
user: user-1
content: 第一个参数是传递第二个参数所指向的句柄个数，所以你这里应该填写 2 的。为什么要填什么 3 了 5 了的？你让系统读取无效数据？按理说 3、4、5 都会读取到垃圾数据，都不应该会成功，但为什么 3、4 成功了，只能说你运气好。

user: user-2
content: 《Windows核心编程》

user: user-3
content: 不懂，帮顶~

user: user-4
content: 系统可能有些句柄号已经预了，比如通常标准输入STD_INPUT_HANDLE获得的句柄值就为3，如果没有这个句柄值自然就无效了
user-0 提问: 请教一个问题，malloc在64 bits linux下，malloc(504)后为什么分配到chunk的size字段是512，而不是520？

回复:
user: user-0
content: 引用 3 楼 SXJIAKE 的回复:确认用的不是 32 位编译器而是 64 位？另外，这个没有什么规定说额外的大小就一定是多少，具体还是看看 glibc 里面 malloc 是如何实现的。 是64位的

user: user-0
content: 多谢，因为size字段是0x201，说明前一个chunk非空闲，所以pre_size字段的8字节被征用了，多谢

user: user-1
content: 除了申请到的对空间之外，内存管理还会分配额外的空间，用于管理申请的空间；比如申请504个堆上空间，那么内存其实申请的比504要大，其他的部分内存主要是用于存储管理已经申请的空间信息。

user: user-2
content: malloc实际分配的内存要比你申请的大，因为需要用它们来保存一些信息，最典型的是保存这块内存的大小，这样在你free的时候，才能释放正确大小的内存。

user: user-3
content: 确认用的不是 32 位编译器而是 64 位？另外，这个没有什么规定说额外的大小就一定是多少，具体还是看看 glibc 里面 malloc 是如何实现的。

user: user-4
content: 参考Linux中malloc相关源代码。

user: user-5
content: malloc分配的内在会比实际申请的大，用于记录必要的数据，具体分配多少取决于编译器对函数的实现方式
user-0 提问: 循环体要使用的指针变量在循环体外声明还是循环体内声明？

回复:
user: user-0
content: 引用 7 楼 mstlq的回复:因为楼主的input和read函数里都有类似fclose (fp);的语句。。。。 close之后的文件指针就是无效的…………  这不是放循坏体内还是循坏体外的问题，关键是fclose之后，不应继续对文件指针做操作 嗯嗯，谢了大哥厉害厉害

user: user-1
content: 因为楼主的input和read函数里都有类似fclose (fp);的语句。。。。 close之后的文件指针就是无效的…………  这不是放循坏体内还是循坏体外的问题，关键是fclose之后，不应继续对文件指针做操作

user: user-0
content: 引用 5 楼 paschen的回复:[quote=引用 3 楼 ZhangHangXing的回复:][quote=引用 1 楼 paschen的回复:]如果是读同一个文件通常是放在循环外，没必要多次打开，但如果每次读完了要重新读的话要把文件位置指针移动到文件开头 但是不放在循环内，会出现错误啊 指针变量的声明[/quote] 什么错误，给出相关代码，出错应该也是你别的原因导致的[/quote] 我的代码就在上面 就是声明指针变量放的位置不同造成的 放在结构外会出错

user: user-2
content: 引用 3 楼 ZhangHangXing的回复:[quote=引用 1 楼 paschen的回复:]如果是读同一个文件通常是放在循环外，没必要多次打开，但如果每次读完了要重新读的话要把文件位置指针移动到文件开头 但是不放在循环内，会出现错误啊 指针变量的声明[/quote] 什么错误，给出相关代码，出错应该也是你别的原因导致的

user: user-0
content: 引用 1 楼 paschen的回复:如果是读同一个文件通常是放在循环外，没必要多次打开，但如果每次读完了要重新读的话要把文件位置指针移动到文件开头 但是不放在循环内，会出现错误啊 指针变量的声明

user: user-0
content: 引用 2 楼 user-3的回复:先打开，然后再在循环中调用，循环结束关闭。没有必要在循环中定义这样就会多次打开。 但是不放在循环内，会出现错误啊。指针变量的声明

user: user-3
content: 先打开，然后再在循环中调用，循环结束关闭。没有必要在循环中定义这样就会多次打开。

user: user-2
content: 如果是读同一个文件通常是放在循环外，没必要多次打开，但如果每次读完了要重新读的话要把文件位置指针移动到文件开头
user-0 提问: 未初始化的指针为何会指向一个合法的地址?

回复:
user: user-0
content: 引用 5 楼 iloveyou418 的回复:[quote=引用 4 楼 fox_lin 的回复:] [quote=引用 2 楼 iloveyou418 的回复:] &pi并不是pi指向的地址，而是pi这个指针自身的地址！ 答案就是这个~默默给楼上打call 其实我不明白不是这个啦,我不明白的是pi的字面值为什么是0x7fffffffe4a0而不是0x0[/quote] 对呀~你定义了这个指针，这个指针在内存中肯定拥有自己的合法地址呀，只是并没有指向一个合法地址，这时候就需要初始化一下，。。。[/quote] 嗯啊,我明白了,就像下面这样:  int fun_2(int **);   int main() {     int r;       int *pi_1;     int *pi_2;     int *pi_3;     int *pi_4;     r = fun_2(&pi_1);     r = fun_2(&pi_2);     r = fun_2(&pi_3);     r = fun_2(&pi_4);       return 0; }   int fun_2(int **pi) {     return 6; }  调试结果: (gdb) p pi_1 $1 = (int *) 0x7fffffffe4a0 (gdb) p pi_2 $2 = (int *) 0x400400 <_start> (gdb) p pi_3 $3 = (int *) 0x400550 <__libc_csu_init> (gdb) p pi_4 $4 = (int *) 0x0  这4个一对比,我就彻底的明白啦,哈哈 谢谢你哦

user: user-1
content: 引用 4 楼 fox_lin 的回复:[quote=引用 2 楼 iloveyou418 的回复:] &pi并不是pi指向的地址，而是pi这个指针自身的地址！ 答案就是这个~默默给楼上打call 其实我不明白不是这个啦,我不明白的是pi的字面值为什么是0x7fffffffe4a0而不是0x0[/quote] 对呀~你定义了这个指针，这个指针在内存中肯定拥有自己的合法地址呀，只是并没有指向一个合法地址，这时候就需要初始化一下，。。。

user: user-0
content: 引用 2 楼 iloveyou418 的回复:&pi并不是pi指向的地址，而是pi这个指针自身的地址！ 答案就是这个~默默给楼上打call 其实我不明白不是这个啦,我不明白的是pi的字面值为什么是0x7fffffffe4a0而不是0x0

user: user-0
content: 引用 1 楼 user-2 的回复:&pi并不是pi指向的地址，而是pi这个指针自身的地址，这个地址是在栈上，肯定是一个合法的地址，pi指向的地址要用pi，由于未初始化，行为是未定义的，既可以指向合法的地址，也可以指向不合法的地址 谢谢解答. &pi是指向指针的指针,运行时,由于指针变量pi已经存在于运行时的内存中,那么肯定有一个存放他的地方,也就是&pi.这个我明白的. 至于pi的字面值为什么是一块合法的地址,也就是你说的"未初始化,可以指向任意地址". 谢谢了.

user: user-1
content: &pi并不是pi指向的地址，而是pi这个指针自身的地址！ 答案就是这个~默默给楼上打call

user: user-2
content: &pi并不是pi指向的地址，而是pi这个指针自身的地址，这个地址是在栈上，肯定是一个合法的地址，pi指向的地址要用pi，由于未初始化，行为是未定义的，既可以指向合法的地址，也可以指向不合法的地址
user-0 提问: 如何看程序运行的过程啊

回复:
user: user-1
content: 引用 2 楼 weixin_41445971 的回复:[quote=引用 1 楼 棉猴的回复:]下断点啊，F9下断点，F5调试，F10单步执行 断点按下了，我摁下F10是显示投影那些的啊[/quote] 用的笔记本? 如果是，那么需要使用Fn + Esc进行切换

user: user-2
content: 可以自己加打印信息，看某些变量的执行过程中的变化； 如果能借助环境提供的方法更好，gdb可以查看程序执行的每步某个变量的值。

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

user: user-4
content: 首先你要知道你用的IDE或者调试工具是什么，然后再学习针对这个IDE或者调试工具的调试方法

user: user-5
content: 百度对于IDE名称（集成开发环境）+怎么调试

user: user-0
content: 引用 1 楼 棉猴的回复:下断点啊，F9下断点，F5调试，F10单步执行 断点按下了，我摁下F10是显示投影那些的啊

user: user-6
content: 下断点啊，F9下断点，F5调试，F10单步执行
user-0 提问: C语言题目

回复:
user: user-0
content: 感觉我好像把问题想得太简单了

user: user-0
content: 引用 3 楼 user-1 的回复:#include<stdio.h> #include<stdlib.h> #define number 17 int main() { 	int i = 0; 	int count = 0; 	int a[number] = { 0 }; 	int ret; 	while (count!=1) { 		count = 0; 		for (int j = 0 ;j < number;j++) { 			if (a[j] == 0) { 				if (count % 3 == 0) { 					a[j] = -1; 					ret = j; 				} 				count++; 			} 		}	 	} 	printf("最后一位是%d", ret); 	return 0; } 代码参考，17个人的话最后一位应该是11号 谢谢你的回答！我思路已经了解了

user: user-1
content: #include<stdio.h> #include<stdlib.h> #define number 17 int main() { 	int i = 0; 	int count = 0; 	int a[number] = { 0 }; 	int ret; 	while (count!=1) { 		count = 0; 		for (int j = 0 ;j < number;j++) { 			if (a[j] == 0) { 				if (count % 3 == 0) { 					a[j] = -1; 					ret = j; 				} 				count++; 			} 		}	 	} 	printf("最后一位是%d", ret); 	return 0; } 代码参考，17个人的话最后一位应该是11号

user: user-1
content: 比如说0,1,2,3,4,5,6这么6个人。题意是第一次0，3，6离开。剩下1，2，4，5，他们四个编号分别变成0,1,2,3.然后再0，3离开
user-0 提问: 卡在这个问题过不去了

回复:
user: user-1
content: #include <stdio.h>   int main() {     int n = 9;     int data[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };     int i, j;          for (i = 0,j=0; i < n;++i) if(data[i]%3!=0)data[j++]=data[i]; 	        for (i = 0; i < j; i++)printf("%d ", data[i]);       return 0; }

user: user-2
content: 你应该是程序运行到第一个循环   i=9  时     nums[9] = nums[9+1]      数组 超限了

user: user-3
content: 前面说的，你在需要j的时候使用的i，还有当删除了一个元素，你依旧还是遍历到第九个元素 以下是示例代码，很常规的方法，可以参考下：  #include <stdio.h>  int main() { 	int real_count = 9; 	int nums[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 	int i, j; 	for (i = 0; i < real_count;) 	{ 		if (nums[i] % 3 == 0) 		{ 			real_count--; 			for (j = i; j < real_count; j++) 			{ 				nums[j] = nums[j + 1]; 			} 		} 		else 		{ 			i++; 		} 	}  	for (i = 0; i < real_count; i++) 	{ 		printf("%d ", nums[i]); 	} 	printf("\n");  	return 0; }

user: user-4
content: 用移动的方法解题的话应该是遍历一次数组，下标是3的倍数的标记-1，然后再遍历一次数组，每碰到一个不为-1的就把新数组下标值+1，放到对应位置上。如此循环 这个问题不一定要让数组中的元素移动，这个问题可以用数组下标i表示刚开始时的的第i位，数组元素的值表示状态用0表示未被移除，用别的数字如-1表示已移除。一次一次的遍历整个数组，每次在数组中删去第0，3，6....个状态显示没有被移除的元素，然后记住它的下标。然后发现某次遍历数组时，遍历完毕也只删去了一个数字，那么跳出循环，最后保存下来的下标就是最后剩下的一位的初始位置，详见你上个帖子里面我给出的代码

user: user-5
content: 直接换个思路~在定义一个数组，从第一个数组中筛选出不为3为倍数的数到第二个数组里就行了啊。。。 最后再讲第一个数组值等于第二个数据不就可以了么

user: user-6
content: 内层循环j的起始值应该是i，此外要看你是需要删除一开始为3的倍数的数，还是每一次移动后倍数为3的数，实在想不清楚可以单步跟踪程序运行，看你代码的执行流程及变量变化，理清你的逻辑
user-0 提问: 怎么理解结果

回复:
user: user-1
content: #include <stdio.h> void main() {         int x=10,y=20,z=30;         printf("%d,%d,%d,%d\n",x=y=z,x=y==z,x==(y=z),x==(y==z));   }   逗号运算符优先级是1，结合性是自左向右； 赋值运算符优先级是2 ；结合性是自右向左； 等于运算符优先级是9 ；结合性是自左向右； printf对参数的运算顺序是：自右向左；因此： 逆序来看： ④x==(y==z)的运算过程为：判断y的值与z的值是否相等，因此返回0； ③x==(y=z) 的运算过程为：把z赋值给y，则y=30；又因为x不等于20,所以返回0；因此结果为0； ②由于③中z的值赋给了y，因此，z==y为真，返回1；因此结果为1； ①简单的赋值，自右向左，因此结果为30；

user: user-2
content: 引用 7 楼 pearling的回复:[quote=引用 6 楼 weixin_41445971 的回复:] 计算机运行结果是30，1，0，0 但我不理解为什么第二个为什么是1 逗号运算符是自右向左计算的 printf("%d,%d,%d,%d\n",x=y=z,x=y==z,x==(y=z),x==(y==z)); 在x==(y=z)这一步，将z赋值给了y，因此当执行x=y==z时，x取的就是y==z逻辑运算结果，因此是1 [/quote] 你是怎么理解i++跟++i 的？

user: user-3
content: printf传参的顺序（压栈顺序）从右向左一次计算，因此顺序为：x == (y == z), x == (y=z), x = y==z, x = y = z;

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

user: user-5
content: 引用 6 楼 weixin_41445971 的回复:计算机运行结果是30，1，0，0 但我不理解为什么第二个为什么是1 涉及到运算符优先级，==（逻辑等）高于=（赋值），所以先计算==的结果，返回true，赋值给x化为int，1

user: user-6
content: 引用 6 楼 weixin_41445971 的回复:计算机运行结果是30，1，0，0 但我不理解为什么第二个为什么是1 逗号运算符是自右向左计算的 printf("%d,%d,%d,%d\n",x=y=z,x=y==z,x==(y=z),x==(y==z)); 在x==(y=z)这一步，将z赋值给了y，因此当执行x=y==z时，x取的就是y==z逻辑运算结果，因此是1

user: user-2
content: 计算机运行结果是30，1，0，0 但我不理解为什么第二个为什么是1

user: user-7
content: 我的是30，30，0，0

user: user-8
content: 30,30,0,0

user: user-9
content: 楼主，帖子上好像没有显示出结果啊

user: user-9
content: 你的y==z 是个表达式啊！
user-0 提问: 关于scanf("%[^\n]",str);

回复:
user: user-0
content: 我好像懂了，%[^\n]读到回车就把缓冲区回车之前的赋给要输入的字符串，要是在scanf格式字符串最后放\n，那么他会一直等你输入一个非空格，tab,回车的东西。读字符串时，为了避免读到上次剩下的回车，可以使用" %s"(%前有个空格，会忽略掉开始的所有的空白字符）或者scanf("%[^]%*c",str);%*c表示读入一个字符，但不向任何地方输入

user: user-1
content: http://blog.csdn.net/sunhaoyn/article/details/41347999
user-0 提问: 怎么判断结构体是否有值啊？

回复:
user: user-0
content: 引用 4 楼 幻夢之葉的回复:[quote=引用 3 楼 ZhangHangXing 的回复:] [quote=引用 1 楼 幻夢之葉的回复:]int count = fread(&temp,sizeof(p),500,fp);  for(n=0;n<count ;n++) 大佬大佬，为什么啊。原因是什么呢？[/quote] fread返回成功读取的项数 详细了解可以网上搜索这个函数的讲解[/quote] 谢谢大佬，我去看看，

user: user-1
content: 引用 3 楼 ZhangHangXing 的回复:[quote=引用 1 楼 幻夢之葉的回复:]int count = fread(&temp,sizeof(p),500,fp);  for(n=0;n<count ;n++) 大佬大佬，为什么啊。原因是什么呢？[/quote] fread返回成功读取的项数 详细了解可以网上搜索这个函数的讲解

user: user-0
content: 引用 1 楼 幻夢之葉的回复:int count = fread(&temp,sizeof(p),500,fp);  for(n=0;n<count ;n++) 大佬大佬，为什么啊。原因是什么呢？

user: user-0
content: 大佬大佬，为什么啊？

user: user-1
content: int count = fread(&temp,sizeof(p),500,fp);  for(n=0;n<count ;n++)
user-0 提问: C的结构体相关的数据,声明时该如何定义

回复:
user: user-0
content: 引用 4 楼 paschen 的回复:写法3  因为你的指针没有指向一块有效的内存地址，函数中解引将导致非法内存访问 嗯,下午估计犯迷糊了,哈哈,刚学C没多久

user: user-1
content: 写法3  因为你的指针没有指向一块有效的内存地址，函数中解引将导致非法内存访问

user: user-0
content: 引用 3 楼 paschen 的回复:写法1  对一个临时变量，即右值，你不能再取地址 嗯,是了,发现这个问题了,需要声明一个指针做中间变量,不如方法2来的利落. 谢谢你的解答.

user: user-1
content: 写法1  对一个临时变量，即右值，你不能再取地址

user: user-0
content: 引用 1 楼 jianwen0529 的回复:1： 没见过&&取地址的写法，语法没有这个规则  2：不用说了，正常操作  3： 可以根据参数要求的类型：指向指针的指针可以估计getaddrinfo内部有类似如下的语句 struct addrinfo *temp = //动态分配; *param_addr_detail = temp; //param_addr_detail 代表对应的形参名称  你外部addr_detail的初始值是多少？ NULL ？ 那*param_addr_detail的内存是不可写的。即使不是NULL而是一个垃圾值，程序崩溃也是分分钟的事情  谢谢这位大哥. 方法1是我自己臆想出来连续取地址以得到 xxx **,确实是错了. 方法2里我的疑问是那个未初始化的指针为什么会在下面的函数调用前具有合法的地址值,这个问题实际是跟这个函数getaddrinfo有关  方法3也是我自己臆想居多,现在已经明白.

user: user-2
content: 1： 没见过&&取地址的写法，语法没有这个规则  2：不用说了，正常操作  3： 可以根据参数要求的类型：指向指针的指针可以估计getaddrinfo内部有类似如下的语句 struct addrinfo *temp = //动态分配; *param_addr_detail = temp; //param_addr_detail 代表对应的形参名称  你外部addr_detail的初始值是多少？ NULL ？ 那*param_addr_detail的内存是不可写的。即使不是NULL而是一个垃圾值，程序崩溃也是分分钟的事情
user-0 提问: C语言文本写入问题

回复:
user: user-0
content: 引用 7 楼 棉猴的回复:应该可以啊，只要两个文件中n值一样就没问题 可是我试过了，好像文本写入不能直接这个在某个特定位置写进去

user: user-1
content: 应该可以啊，只要两个文件中n值一样就没问题

user: user-0
content: 引用 2 楼 user-3的回复:欢迎采纳答案 谢谢！ 采纳什么答案？？？？？？？？

user: user-0
content: 引用 1 楼 qq_40680007的回复:有没有人 ？？？？？？？？？？？？

user: user-0
content: 引用 3 楼 柚子将军的回复:看代码才知道问题原因 int pro[40]; FILE *fp_pro; fp_pro=fopen("d:\\proficiency.txt","r+"); fscanf(fp_pro,"%d",pro); fprintf(fp_pro,"%d",pro[n]); fclose(fp_pro);    代码是这样的 我的n就是每次产生的随机数 可是好像不能这么用

user: user-2
content: 看代码才知道问题原因

user: user-3
content: 欢迎采纳答案 谢谢！

user: user-0
content: 有没有人
user-0 提问: 小白求大神帮忙

回复:
user: user-1
content: //逆 void ReversePrint(const char *str) {     if ( *str != 0 )     {         ReversePrint(str+1);         printf("%c", *str);    } }

user: user-2
content: void printStr(char* p, int pLen) {         打印 p[pLen-1];         if(pLen == 1)                  return;          printStr(char* p, pLen-1); } void main() {        初始化  char* p;        printStr(p, p的长度); }

user: user-2
content: void printStr(char* p, int pLen) {         打印 p[pLen-1];         if(pLen == 1)                  return;          printStr(char* p, pLen-1); } void main() { char* p        printStr(char* p, pLen-1); }
user-0 提问: C语言如何编译生成库文件？

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

user: user-0
content: 引用 2 楼 paschen 的回复:可以动态链接、静态链接，当然也可以直接以提供头文件和源文件，通常为了保护你的代码，一般以库文件方式提供，书的话推荐《程序员的自我修养--链接、装载与库》 是的，我就是对“动态链接、静态链接，当然也可以直接以提供头文件和源文件”都分不清，不知道库文件咋生成，我研究看看，谢谢

user: user-0
content: 引用 1 楼 hzy_76 的回复:一般我们用gcc吧，-c选项就可以只编译而不链接，生成库文件（习惯上扩展名为o），如：  gcc -c test.c  这个库文件就可以被其他程序引用、链接了。  如果需要静态库文件（习惯上扩展名为a），可以使用ar命令：  ar rcs libtest.a test.o  这样生成的库文件以lib开头，其他程序编译时用-ltest即能使用它。  动态库文件则使用-shared参数：  gcc -fPIC -shared -o test.so test.c  收到，谢谢，我要的就是这些东西，静态库文件是什么，我百度看看，先学习试试，然后我再看看ar编译的含义，再瞅瞅动态库，我就是对这些都蒙蒙的，还不知道学名是啥，不知道应该怎么学

user: user-2
content: 可以动态链接、静态链接，当然也可以直接以提供头文件和源文件，通常为了保护你的代码，一般以库文件方式提供，书的话推荐《程序员的自我修养--链接、装载与库》

user: user-3
content: 一般我们用gcc吧，-c选项就可以只编译而不链接，生成库文件（习惯上扩展名为o），如：  gcc -c test.c  这个库文件就可以被其他程序引用、链接了。  如果需要静态库文件（习惯上扩展名为a），可以使用ar命令：  ar rcs libtest.a test.o  这样生成的库文件以lib开头，其他程序编译时用-ltest即能使用它。  动态库文件则使用-shared参数：  gcc -fPIC -shared -o test.so test.c
user-0 提问: 要被逼疯了！ 求教

回复:
user: user-1
content: 在build处clean一下或者重建工程复制粘贴代码编译

user: user-2
content: 现代中国人的能力差别很大程度上体现在会不会合理高效地使用百度上。 百度搜相关关键字。

user: user-3
content: 之前我也这样，后面直接不用项目来编程， 用新建空白文件，然后保存成 .c 的格式。  不过我是在学习C语言时候这样用的。

user: user-4
content: 。。。是不是你没有建工程啊，或者文件放进去了没导入、、

user: user-1
content: 在build处clean一下试试

user: user-5
content: 重新创建工程，重新复制代码，重新编译！！！

user: user-0
content: 来点人啊！！！！！！

user: user-0

user: user-6
content: 重新建立个工程试试

user: user-7
content: https://stackoverflow.com/questions/41491110/code-blocks-it-seems-that-this-project-has-not-been-built-yet 参考一下  http://blog.csdn.net/anonymalias/article/details/21016721  还有这个博客；  http://bbs.csdn.net/topics/380252837 还有之前的帖子；  http://blog.csdn.net/hxl5955/article/details/52315767  能把你逼疯的不是没有解决办法，而是没有发现解决方法；  网上对这个问题，好多人都遇到了。

user: user-8
content: http://blog.csdn.net/cancan0907/article/details/78073101 参考一下

user: user-9
content: 是.....................
user-0 提问: 指针问题，求教

回复:
user: user-1
content: 第一，数组名arr只能看做是常量指针，是不能做自增运算的，你可以再定义一个指针char *ptr=arr; while((*(ptr++))!='\0') 第二，你的循环内的指针自增都是多余的，不仅不需要而且造成不符合逻辑和可能的指针越界，循环内部的ptr都不需要++

user: user-2
content: #include<stdio.h> #include<string.h> int main() { 	char arr[80]; 	int i = 0 , lwords = 0 , swords = 0 , digit = 0 , space = 0 , other = 0; 	 	gets(arr); 	while(arr[i] != '\0') 	{ 		if(arr[i] >= 'a' && arr[i] <= 'z') 			swords++; 		else if(arr[i] >= 'A' && arr[i] <= 'Z') 			lwords++; 		else if(arr[i] >= '0' && arr[i] <= '9') 			digit++; 		else if(arr[i] == ' ') 			space++; 		else 			other++; 		i++; 	} 	 	printf("小写字母数：%d\n",swords); 	printf("大写字母数：%d\n",lwords); 	printf("数字数：%d\n",digit); 	printf("空格数：%d\n",space); 	printf("其他数：%d\n",other); 	 	return 0; }

user: user-3
content: 引用 4 楼 qq_33302340 的回复:不需要一直加  后++  改为前++  别的没问题 改前加一样有问题。建议测试一下试试。 前加也会导致一些字符没有判断。

user: user-4
content: 不需要一直加  后++  改为前++  别的没问题

user: user-3
content: #include<stdio.h> #include<string.h> int main() {     char arr[80];     int lwords = 0 , swords = 0 , digit = 0 , space = 0 , other = 0;      gets(arr);     char *p = arr;     while(*p != '\0')     {         if(*p >= 'a' && *p <= 'z')             swords++;         else if(*p >= 'A' && *p <= 'Z')             lwords++;         else if(*p >= '0' && *p <= '9')             digit++;         else if(*p == ' ')             space++;         else             other++;         p++;     }      printf("小写字母数：%d\n",swords);     printf("大写字母数：%d\n",lwords);     printf("数字数：%d\n",digit);     printf("空格数：%d\n",space);     printf("其他数：%d\n",other);      return 0; }  参考一下吧；  首先：arr是数组名，因此它不能做左值，但是arr++等价arr = arr + 1;这样arr就做了左值，所以矛盾； 其次，即使arr赋值给了一个可以做左值的指针，但是while (*(p++) != 0)也是不行，因为++的副作用。这样能判断*(p++)是否位'\0'，但是判断之后，p就指向了下一个字符，那么就会把当前的字符跨过去了。你的结果计算出来的数值总数肯定是比实际字符数少的。

user: user-5
content: if(*(arr++) >= 'a' && *(arr++) <= 'z') else if(*(arr++) >= 'A' && *(arr++) <= 'Z') else if(*(arr++) >= '0' && *(arr++) <= '9') else if(*(arr++) == ' ')  //为什么都 ++？你是判断当前字符，把这里所有的++都删掉即可 //另外循环 while(*(arr++) != '\0') //改为 while(*(arr) != '\0') { //你的操作 arr++; }
user-0 提问: IAR刚打开时为什么不能go to definition 呢?

回复:
user: user-0
content: 引用 8 楼 u014783685 的回复:编译一下工程应该就可以了吧 不需要，过一会自动就识别了，可以。

user: user-1
content: 编译一下工程应该就可以了吧

user: user-2

user: user-2
content: 引用 4 楼 wearlee 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 状态栏中不是显示了正在扫描吗？   大哥,我咋没看到写了正在扫描啊,能截个图看看吗?[/quote] 我猜的。 因为VS20XX IDE在打开一个项目时，状态栏中会显示“正在……”

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 wearlee 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] 状态栏中不是显示了正在扫描吗？   大哥,我咋没看到写了正在扫描啊,能截个图看看吗?[/quote] 我猜的。 因为VS20XX IDE在打开一个项目时，状态栏中会显示“正在……” [/quote] 我说我怎么找了半天没有找到,不过你的猜测也很有依据,里面的机制大概就是这样的.谢谢你啊.....

user: user-2
content: 状态栏中不是显示了正在扫描吗？

user: user-0
content: 意思就是刚打开的时候不能go to definition of

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:状态栏中不是显示了正在扫描吗？   大哥,我咋没看到写了正在扫描啊,能截个图看看吗?

user: user-0
content: 大哥,我咋没看到写了正在扫描啊,能截个图看看吗?
user-0 提问: C语言实现程序变量实时更新

回复:
user: user-1
content: 保證新數據被保存，這是不可能做到的。我的方案衹是保證在新數據保存過程出現意外時，舊數據還能生效，程序能夠正常啓動。

user: user-2
content: 没有十分完善的做法，可以做备份文件，实现将断电前前一个参数保存没问题。 根据要保存的数据的  引用 3 楼 NeiGongShenHou 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] [quote=引用 1 楼 hzy_76 的回复:] 分成两个文件，一个后缀new，另一个为old，每次从new读，若没找到new文件则从old文件读。 保存变量时，先删除old文件，然后把new文件改名为old，最后保存新的new文件。 这个不能保证掉电前若未保存或正要保存的数据保存不到new文件里。但是可以保证掉电前的前一个保存不会有问题，即old文件里的数据保证没问题。  这样操作是可行的，起码能保证系统启动时能够拿到数据。  [/quote] 如果需要频繁的更新数据，这样每次都需要新建一个new文件，是不是会影响效率[/quote] 不是每次都new文件，而是总共就2个文件，一个是实时更新的，一个是比最新的之前的。即最新和次最新的。 如果要保证数据完整就要牺牲一些程序的性能，因为保存数据和将新的拷贝至次最新文件都会要占用时间片的。

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:[quote=引用 1 楼 hzy_76 的回复:] 分成两个文件，一个后缀new，另一个为old，每次从new读，若没找到new文件则从old文件读。 保存变量时，先删除old文件，然后把new文件改名为old，最后保存新的new文件。 这个不能保证掉电前若未保存或正要保存的数据保存不到new文件里。但是可以保证掉电前的前一个保存不会有问题，即old文件里的数据保证没问题。  这样操作是可行的，起码能保证系统启动时能够拿到数据。  [/quote] 如果需要频繁的更新数据，这样每次都需要新建一个new文件，是不是会影响效率

user: user-2
content: 引用 1 楼 hzy_76 的回复:分成两个文件，一个后缀new，另一个为old，每次从new读，若没找到new文件则从old文件读。 保存变量时，先删除old文件，然后把new文件改名为old，最后保存新的new文件。 这个不能保证掉电前若未保存或正要保存的数据保存不到new文件里。但是可以保证掉电前的前一个保存不会有问题，即old文件里的数据保证没问题。  这样操作是可行的，起码能保证系统启动时能够拿到数据。

user: user-1
content: 分成两个文件，一个后缀new，另一个为old，每次从new读，若没找到new文件则从old文件读。 保存变量时，先删除old文件，然后把new文件改名为old，最后保存新的new文件。
user-0 提问: C语言字符数组题目（抱歉各位我实在没有分了）

回复:
user: user-1
content: 这个更像选择排序，虽然冒泡排序和选择排序时间复杂度在无穷大时相近。但是还是不一样的。

user: user-2
content: 实际就是一个冒泡排序，搞清楚了就很容易理解了：http://blog.csdn.net/guoweimelon/article/details/50902597

user: user-3
content: 你不理解的 if(p!=i) 接合上边的代码意思是发现有比cs[i]还小的字符串，然后交换他们！

user: user-3
content: 应该容易理解 把冒泡排序算法理解，这个轻轻松松！ 外层循环，i 其实记录着最小的字符串的位置
user-0 提问: 关于指针操作的一个小问题

回复:
user: user-1
content: 引用 5 楼 qq_41231926 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] #include <stdio.h>  int main(void) {     char * s1;     char * s2 = "Hello world!";          *s1 = *s2;     printf("%c", *s1);          return 0; } s1是野指针，即s1指针里的地址值是随机的，指向的内存区域是随机的。若s1指向了不可写的内存区域，那么*s1 = *s2就会导致段错误；若s1指向了可写的区域，那么是没问题的。可以正常运行。但是这个不确定，所以代码只能有时可以有时不可以。  第二个和第一个，都是因为野指针导致的。对于这样的代码有时好有时不好的情况，是不符合程序要求的。程序需要保证没问题。 先举个例子，如果我初始化一个指向int类型的指针:int * p; 那么我给这个指针的初始化语句可以这么写:*p = 7. 类似的，我给的程序里s1和s2都是指向char类型的指针，那么*s1得到的应该是s1指向的值，也就是字符串首字符的值，那我令*s2 = *s1,使得s2指针指向这个字符，这不就是把指针给初始化了吗？请问这有什么不同吗？？？ [/quote] 指针初始化一般是int *p = NULL; *p = 7;是指向p指向的内存里（4个字节）存放数值7，但是p是野指针，它指向的区域是随机，若指向的区域是不可写的，那么把7赋值给*p，不就是往不可写的内存单元里写数据吗？所以，会导致段错误。

user: user-2
content: 引用 6 楼 qq_41231926的回复:[quote=引用 1 楼 guest25 的回复:] *s2 = *s1;     printf("%c", *s2); 你是想指针复制还是指针指向的内存里的内容复制啊？如果是指针复制请把上面语句里的＊号删除，如果是复制内存里的内容请把s2初始化才行。 我想复制内存里的内容的，那应该怎么样给s2初始化呢？ *s2 = *s1;不就是给s2初始化了么？ [/quote] s2 = s1; 或者 s2 = malloc(); s2 s1是指针变量，如果带*就是访问指针指向的内存空间了。

user: user-0
content: 引用 1 楼 guest25 的回复:*s2 = *s1;     printf("%c", *s2); 你是想指针复制还是指针指向的内存里的内容复制啊？如果是指针复制请把上面语句里的＊号删除，如果是复制内存里的内容请把s2初始化才行。 我想复制内存里的内容的，那应该怎么样给s2初始化呢？ *s2 = *s1;不就是给s2初始化了么？

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:#include <stdio.h>  int main(void) {     char * s1;     char * s2 = "Hello world!";          *s1 = *s2;     printf("%c", *s1);          return 0; } s1是野指针，即s1指针里的地址值是随机的，指向的内存区域是随机的。若s1指向了不可写的内存区域，那么*s1 = *s2就会导致段错误；若s1指向了可写的区域，那么是没问题的。可以正常运行。但是这个不确定，所以代码只能有时可以有时不可以。  第二个和第一个，都是因为野指针导致的。对于这样的代码有时好有时不好的情况，是不符合程序要求的。程序需要保证没问题。 先举个例子，如果我初始化一个指向int类型的指针:int * p; 那么我给这个指针的初始化语句可以这么写:*p = 7. 类似的，我给的程序里s1和s2都是指向char类型的指针，那么*s1得到的应该是s1指向的值，也就是字符串首字符的值，那我令*s2 = *s1,使得s2指针指向这个字符，这不就是把指针给初始化了吗？请问这有什么不同吗？？？

user: user-3
content: 两段都是错的，你的s1指针还没分配内存就使用了，是野指针，程序行为未定义，即使程序没崩，也只能说明运气好

user: user-4
content: 两个代码都不对，内存溢出

user: user-1
content: #include <stdio.h>  int main(void) {     char * s1;     char * s2 = "Hello world!";          *s1 = *s2;     printf("%c", *s1);          return 0; } s1是野指针，即s1指针里的地址值是随机的，指向的内存区域是随机的。若s1指向了不可写的内存区域，那么*s1 = *s2就会导致段错误；若s1指向了可写的区域，那么是没问题的。可以正常运行。但是这个不确定，所以代码只能有时可以有时不可以。  第二个和第一个，都是因为野指针导致的。对于这样的代码有时好有时不好的情况，是不符合程序要求的。程序需要保证没问题。

user: user-2
content: *s2 = *s1;     printf("%c", *s2); 你是想指针复制还是指针指向的内存里的内容复制啊？如果是指针复制请把上面语句里的＊号删除，如果是复制内存里的内容请把s2初始化才行。
user-0 提问: 内存莫名的变化

回复:
user: user-1
content: 引用 12 楼 wodexiaojidan 的回复:引用 11 楼 ipqtjmqj 的回复:[quote=引用 9 楼 wodexiaojidan 的回复:] [quote=引用 8 楼 ipqtjmqj 的回复:] [quote=引用 6 楼 wodexiaojidan 的回复:] [quote=引用 5 楼 ipqtjmqj 的回复:] https://www.ideone.com/Rm4XSg编译器的毒？ 我的代码可能与你的不一样[/quote]但我用你的那个编译器试了一下  也是正常的[/quote] 你用的是微软的吗[/quote]gcc[/quote] ideone后台用的应该也是gcc,不过gcc有很多版本，编译时可以加不同选项，比如优化开得高，都有可能造成结果不一致。

user: user-0
content: 引用 11 楼 ipqtjmqj 的回复:引用 9 楼 wodexiaojidan 的回复:[quote=引用 8 楼 ipqtjmqj 的回复:] [quote=引用 6 楼 wodexiaojidan 的回复:] [quote=引用 5 楼 ipqtjmqj 的回复:] https://www.ideone.com/Rm4XSg编译器的毒？ 我的代码可能与你的不一样[/quote]但我用你的那个编译器试了一下  也是正常的[/quote] 你用的是微软的吗[/quote]gcc

user: user-1
content: 引用 9 楼 wodexiaojidan 的回复:引用 8 楼 ipqtjmqj 的回复:[quote=引用 6 楼 wodexiaojidan 的回复:] [quote=引用 5 楼 ipqtjmqj 的回复:] https://www.ideone.com/Rm4XSg编译器的毒？ 我的代码可能与你的不一样[/quote]但我用你的那个编译器试了一下  也是正常的[/quote] 你用的是微软的吗

user: user-2
content: 你的代码在vs2010上编译不通过，不知你用的什么编译器？  for(i = 0; i < 10; ++i){         node *node = malloc(sizeof(node) * 1); 这段代码 node* node = ....//这句有问题 改成 node* node1 =....

user: user-1
content: 引用 6 楼 wodexiaojidan 的回复:引用 5 楼 ipqtjmqj 的回复:https://www.ideone.com/Rm4XSg编译器的毒？ 我的代码可能与你的不一样

user: user-0
content: 引用 8 楼 ipqtjmqj 的回复:引用 6 楼 wodexiaojidan 的回复:[quote=引用 5 楼 ipqtjmqj 的回复:] https://www.ideone.com/Rm4XSg编译器的毒？ 我的代码可能与你的不一样[/quote]但我用你的那个编译器试了一下  也是正常的

user: user-0
content: 引用 3 楼 hdt 的回复:引用 2 楼 wodexiaojidan 的回复:[quote=引用 1 楼 hdt 的回复:] 贴出你的代码？代码就是图上的这些，还有一个结构体定义，一个main函数调用，没了 最好能够贴文字的，否则难道要我重敲一边？[/quote]你试试

user: user-1
content: https://www.ideone.com/Rm4XSg

user: user-0
content: 引用 5 楼 ipqtjmqj 的回复:https://www.ideone.com/Rm4XSg编译器的毒？

user: user-0
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct node{ 	int a; 	struct node *next; }node;node *create(void) { 	node *head = malloc(sizeof(node)); 	node *p = head;  	int i; 	for(i = 0; i < 10; ++i){ 		node *node = malloc(sizeof(node) * 1); 		node->a = i + 1; 		node->next = NULL; 		printf("\n1. node: addr = %p, &a = %p, a = 0x%x\n", node, &node->a, node->a); 		p->next = node; 		printf("2. node: addr = %p, &a = %p, a = 0x%x\n", node, &node->a, node->a); 		p = p->next; 		printf("3. node: addr = %p, &a = %p, a = 0x%x\n", node, &node->a, node->a); 	} 	p->next = NULL;  	return head; }int main(void) { 	node *a = create();  	return 0; }

user: user-2
content: 引用 2 楼 wodexiaojidan 的回复:引用 1 楼 hdt 的回复:贴出你的代码？代码就是图上的这些，还有一个结构体定义，一个main函数调用，没了 最好能够贴文字的，否则难道要我重敲一边？

user: user-0
content: 引用 1 楼 hdt 的回复:贴出你的代码？代码就是图上的这些，还有一个结构体定义，一个main函数调用，没了

user: user-2
content: 贴出你的代码？