Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: winpcap编程入门求组！

回复:
user: user-0
content: 引用 6 楼 jack960330 的回复:用调试器看看进行错误堆栈追踪，有必要的话，试着贴代码发上来 我重下了一遍winpcap包，重新配置了一遍，现在好了

user: user-0
content: 引用 6 楼 jack960330 的回复:用调试器看看进行错误堆栈追踪，有必要的话，试着贴代码发上来 代码就是这个http://www.cnblogs.com/blacksword/archive/2012/03/09/2387189.html 调试显示的是 用了这个函数就报错，但是这不是库函数么...

user: user-1
content: 用调试器看看进行错误堆栈追踪，有必要的话，试着贴代码发上来

user: user-0
content: 引用 4 楼 jack960330 的回复:你发错误信息 编译没错，一运行就弹出，

user: user-0
content: 引用 1 楼 jack960330 的回复:异常啊，winpcap 网上有示例代码，打开网络适配器，设置混杂模式啥的，都有 对啊，我原原本本把代码拷贝过去了，怎么就运行出错了呢...

user: user-1
content: 引用 2 楼 aiur233 的回复:[quote=引用 1 楼 jack960330 的回复:] 异常啊，winpcap 网上有示例代码，打开网络适配器，设置混杂模式啥的，都有 对啊，我原原本本把代码拷贝过去了，怎么就运行出错了呢...[/quote]  到底什么错误

user: user-1
content: 引用 2 楼 aiur233 的回复:[quote=引用 1 楼 jack960330 的回复:] 异常啊，winpcap 网上有示例代码，打开网络适配器，设置混杂模式啥的，都有 对啊，我原原本本把代码拷贝过去了，怎么就运行出错了呢...[/quote] 你发错误信息

user: user-1
content: 异常啊，winpcap 网上有示例代码，打开网络适配器，设置混杂模式啥的，都有
user-0 提问: C语言二维数组传递突然由字母变成乱码

回复:
user: user-1
content: 单步跟踪程序运行以分析原因

user: user-2
content: 贴出代码看一看啦，，，，

user: user-0
content: 我单步运行过了，上一个函数还好好的，到下一个函数就乱码了QAQ

user: user-0
content: display到下一个函数之间没有其他任何操作，我是在下一个函数之前puts了一下数组，就莫名其妙变成这样了QAQ
user-0 提问: 二维数组空间分配15,30,45什么意思？

回复:
user: user-0
content: 这么简单的问题没人回答吗

user: user-0
content: 引用 7楼stdcall_Jeremy 的回复:因为是你自己分配的空间,一个字符串就是一行,分配多的保留呵呵

user: user-0
content: 引用 8楼我是你的主体 的回复:引用 7楼stdcall_Jeremy 的回复:因为是你自己分配的空间,一个字符串就是一行,分配多的保留呵呵那句话说了一个字符串一行了？

user: user-1
content: 因为是你自己分配的空间,一个字符串就是一行,分配多的保留

user: user-2
content: 引用 4 楼 labuboco 的回复:[quote=引用 3楼小灸舞 的回复:]就是说你在定义char aname[][15] = {"XXX","XXX","XXXX"};的时候系统分配给你了45个字节那么长的空间 1-15字节给了第一个字符串 16-30字节给了第二个字符串 31-45字节给了第三个字符串15我记得代表列数吧？[/quote] 你说的没错，第一个字符串占了1行（15列），一列只有一个字节，只能存储一个char字符

user: user-0
content: 引用 5楼小灸舞 的回复:[quote=引用 4 楼 labuboco 的回复:] [quote=引用 3楼小灸舞 的回复:]就是说你在定义char aname[][15] = {"XXX","XXX","XXXX"};的时候系统分配给你了45个字节那么长的空间 1-15字节给了第一个字符串 16-30字节给了第二个字符串 31-45字节给了第三个字符串15我记得代表列数吧？[/quote] 你说的没错，第一个字符串占了1行（15列），一列只有一个字节，只能存储一个char字符[/quote]那为什么第二个字符也占了一整行

user: user-0
content: 引用 3楼小灸舞 的回复:就是说你在定义char aname[][15] = {"XXX","XXX","XXXX"};的时候系统分配给你了45个字节那么长的空间 1-15字节给了第一个字符串 16-30字节给了第二个字符串 31-45字节给了第三个字符串15我记得代表列数吧？

user: user-2
content: 就是说你在定义char aname[][15] = {"XXX","XXX","XXXX"};的时候系统分配给你了45个字节那么长的空间 1-15字节给了第一个字符串 16-30字节给了第二个字符串 31-45字节给了第三个字符串

user: user-0
content: 引用 1楼赵4老师 的回复:从左往右数第几个字符请说明原因

user: user-3
content: 从左往右数第几个字符
user-0 提问: 初学者求助！！二维数组如何比较和输出每行的最大和每列最大？？

回复:
user: user-1
content: 建议将i,j替换为y,x以免弄混行和列。

user: user-2
content: 一层还是两层你扫描的数据量是不变的，一层两层都可以。 #include <stdlib.h> #include <stdio.h>  int main(int argc, char *argv[]) {     int a[5][5] = {{5, 3, 6, 8, 9}, {0, 23, 10, 30, 47}, {33, 54, 16, 80, 49}, {23, 38, 70, 67, 88}, {11, 92, 87, 64, 50}};     int b[5] = {0};     int c[5] = {0};     int i = 0;     for(i = 0; i < 25; i ++)     {         //printf("%d , %d", *(*a + i), i / 5);         if(b[(int)(i / 5)] < *(*a + i))         {             b[(int)(i / 5)] = *(*a + i);             printf("(%d, %d)", b[(int)(i / 5)], i / 5);         }         if(c[i % 5] < *(*a + i))         {             c[i % 5] = *(*a + i);         }     }     printf("\n");     for(i = 0; i < 5; i ++)     {         printf("line %d: max %d\n", i, b[i]);     }     for(i = 0; i < 5; i ++)     {         printf("raw %d: max %d\n", i, c[i]);     }     return 0; } 两层就不用我写了吧。

user: user-3
content: 遍历某一行/列的最大值可以只用一层循环  下面是遍历索引为1的行所有列，其中N为列的总数  for (i = 0; i < N; ++i)       a[1][i]  .....
user-0 提问: C语言 查询订单系统进不去  还请大神指点 

回复:
user: user-0
content: 引用 2 楼 user-2的回复:截个运行效果图来看看 就是主界面选择订单详情，输入订单号后，直接返回主函数了

user: user-0
content: 引用 1 楼 paschen的回复:自己单步跟踪程序运行，是不是文件没有打开成功，然后函数就返回了 还不会单步执行

user: user-1
content: 自己单步跟踪程序运行，是不是文件没有打开成功，然后函数就返回了

user: user-2
content: 截个运行效果图来看看
user-0 提问: 初学c，还请大神找下问题，谢谢了

回复:
user: user-1
content: 读入数组和打印出数组必须要用循环

user: user-2
content: 建议你直接在代码里初始化数组,每次都在运行时从键盘输入好麻烦

user: user-2
content: scanf("%d",&a[3][4])是错误地,因为数组是从a[0][0]开始,最多到a[2][3],而且你只输入了一个数组元素,应当用到循环输入全部数组元素

user: user-3
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-4
content: scanf("%d", &a[3][4]); 这个地方用下标，表示二维数组成员中的一个，而且数组开头是从a[0][0]开始，a[3][4]已经越界 要输入12个的话应该用到循环输入

user: user-5
content: 最后一个printf没分号

user: user-5
content: scanf("%d", &a[3][4]); 这边你就对数组最后一个元素赋值了，其他都未初始化

user: user-6
content: 楼主的scanf有问题，楼主那样写只能读取一个数字  #include<iostream> #include <stdio.h> using namespace std; int main() { 	int i, j, max, row=0, colum=0; 	int a[3][4]; 	printf("Please input 12 numbers: \n"); 	int n = 0; 	while(scanf("%d%*c", &a[n/4][n%4]))if(++n == 12)break; 	max=a[0][0]; 	for(i = 0; i < 3; i++) 	{ 		for(j=0; j < 4; j++) 		{ 			if(a[i][j] > max) 			{ 				max = a[i][j]; 				row = i; 				colum = j; 			}  		} 	} 	printf("max=%d\n", max); 	printf("row=%d\ncolum=%d\n", row, colum); 	system("pause"); 	return 0; }  输在一行或者输一个数字换一行都行

user: user-7
content: 改成这样：   #include <stdio.h>  void main() { 	int i, j, max, row=0, colum=0; 	int a[3][4]; 	printf("Please input 12 numbers: \n"); 	for(i = 0; i < 3; i++) 	{ 		for(j=0; j < 4; j++) 		{ 			scanf("%d", &a[i][j]); 		} 	} 	max=a[0][0]; 	for(i = 0; i < 3; i++) 	{ 		for(j=0; j < 4; j++) 		{ 			if(a[i][j] > max) 			{ 				max = a[i][j]; 				row = i; 				colum = j; 			}  		} 	} 	printf("max=%d\n", max); 	printf("row=%d\ncolum=%d\n", row, colum); }

user: user-8
content: scanf那点错了
user-0 提问: 如何解决发送端数据突然暴增的问题？ 

回复:
user: user-1
content: 引用 6 楼 u012879787 的回复:[quote=引用 5 楼 zilaishuichina 的回复:] 客户端数据突然暴增，发的频率快，服务器一般要做什么处理？   设置一个阀值，比如10秒最多只接受100个包，超出就断开连接   第2个问题： 网络的吞吐量到底是什么意思？   每秒接收/发送的比特数/字节数  吞吐量这个概念为什么会出现在 应用程序中？  按照你的书佛啊，这个概念是属于网络的，  为什么我去面试，面试官说什么吞吐量。　我很奇怪。  这属于　网络接收的比特数目，和应用程序有什么关系？  难道是因为应用层影响接收窗口大小，所以面试官就问我以前开发的程序的吞吐量？  [/quote]  如果你是做服务端/ 网络层相关的开发的， 涉及iocp / epoll开发， 那面试的人意思可能是问你， 你的网络层 能承受每秒收发多少个包，或者是能承受的并发连接数，  举个例子，网游服务端， 游戏的网关服务器大概是并发5000人的情况下， 每秒上行+下行30-40W个小包（100字节以内的包）

user: user-0
content: 引用 5 楼 zilaishuichina 的回复:客户端数据突然暴增，发的频率快，服务器一般要做什么处理？   设置一个阀值，比如10秒最多只接受100个包，超出就断开连接   第2个问题： 网络的吞吐量到底是什么意思？   每秒接收/发送的比特数/字节数  吞吐量这个概念为什么会出现在 应用程序中？  按照你的书佛啊，这个概念是属于网络的，  为什么我去面试，面试官说什么吞吐量。　我很奇怪。  这属于　网络接收的比特数目，和应用程序有什么关系？  难道是因为应用层影响接收窗口大小，所以面试官就问我以前开发的程序的吞吐量？

user: user-1
content: 客户端数据突然暴增，发的频率快，服务器一般要做什么处理？   设置一个阀值，比如10秒最多只接受100个包，超出就断开连接   第2个问题： 网络的吞吐量到底是什么意思？   每秒接收/发送的比特数/字节数

user: user-2
content: 吞吐：两个层面，一个吞，一个吐，吞就是接收能力，吐就是发送能力，其实就是网络的收发能力，

user: user-0
content: 引用 2 楼 user-4 的回复:数据总有协议吧，发得快就处理快一些而已了。如果发现接收缓冲区中有很多无法解析的数据，把这个连接断开就是了。  第2个问题： 网络的吞吐量到底是什么意思？

user: user-3
content: 接收端设置一个足够大的FIFO缓冲区。

user: user-4
content: 数据总有协议吧，发得快就处理快一些而已了。如果发现接收缓冲区中有很多无法解析的数据，把这个连接断开就是了。
user-0 提问: 最近在读内核代码，有一个问题一直困惑着我

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

user: user-1
content: 1.gcc等编译器扩展，取最后一个表达式的值 2.typeof(expr)不会导致expr被计算，比如typeof(i++)不会使i自增
user-0 提问: 请问我用VS2015C语言里用fseek()函数怎么不能成功移动位置呢?

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:估计是你fopen的打开方式有问题。  如果希望能在写入时用fseek定位，fopen的模式需要设置为“r+" 或 "rb+" fp = fopen(text_file, "r+"); or fp = fopen(binary_file, "rb+");   谢谢大神，的确是这个原因!

user: user-1
content: 估计是你fopen的打开方式有问题。  如果希望能在写入时用fseek定位，fopen的模式需要设置为“r+" 或 "rb+" fp = fopen(text_file, "r+"); or fp = fopen(binary_file, "rb+");
user-0 提问: 求大神帮忙看看问题   登陆系统无法使用

回复:
user: user-0
content: 引用 1 楼 user-1的回复:scanf_s使用时，需要给出读取字符数量，否则无法获取正确的值scanf_s("%c", &xz, 1); 楼主的login中打开文件之后的if判断有问题，是== ，而不是=号。if (fp == NULL) 谢谢，已经完美解决啦

user: user-1
content: scanf_s使用时，需要给出读取字符数量，否则无法获取正确的值scanf_s("%c", &xz, 1); 楼主的login中打开文件之后的if判断有问题，是== ，而不是=号。if (fp == NULL)
user-0 提问: 数组传递，在被调函数中指针的大小

回复:
user: user-0
content: 好像是我自己理解错了，sizeof(ar[0])是数组ar第一个元素的字节， 而sizeof(ar)指的是数组ar第一个元素地址的大小，而系统是64位的 谢谢大家啦，今天第一次在CSDN上提问，大家的回答既及时又给力

user: user-1
content: 引用 楼主 alex19941124 的回复:按理说int 型的指针是4字节啊，为什么会显示有8字节呢？ 之前看教材，视频都是说四字节。。。。。 }  那说明你看的教材和视频都在乱说，纯属误人子弟。  指针的大小一般总是与系统的 long 型保持一致。 如果在你的系统中，sizeof(long) == 8, 那么指针就为8字节。

user: user-0
content: [b]不知道为什么我的sizeof(ar)居然跟sizeof(ar[0])不一样大

user: user-0

user: user-2
content: 引用 楼主 alex19941124 的回复:按理说int 型的指针是4字节啊，为什么会显示有8字节呢？  关于C语言的指针类型与编译运行环境有关。如果你目标环境是64位系统，那么地址宽度就是8字节的，所以指针类型就是8字节的宽度。如果是32位的，那么地址宽度就是4字节；在某些嵌入式系统中，比如8位的单片机，地址可能就是2字节甚至1个字节的……  因此，如果你用的C语言实现支持C99标准，那么请使用uintptr_t或intptr_t整数类型来存放指针的值；否则，可以使用size_t。

user: user-3
content: int 型的指针是4字节啊，为什么会显示有8字节  int型指针长度和语言，编译器，操作系统(32位/64位)等有关联，但是在书及视频中多采用32位C++语言来计算。某些编译器之间存在某些不一致的情况。

user: user-4
content: 不知道楼主的环境是什么？
user-0 提问: C语言参数传递

回复:
user: user-1
content: 请那些喜欢将数组作为函数参数传来传去的码农思考一下为什么不把整个互联网内容当作函数参数传来传去呢？

user: user-0
content: 谢谢谢谢，功力太浅，没能完全看懂，继续努力

user: user-1
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

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

user: user-2
content: 数组作为参数传递时就退化成了指针，你得再传递一个参数记录数组的大小，如你上面代码的n  访问越界并不会导致编译失败，但可能导致运行时的崩溃
user-0 提问: 一个使用pthread_cond_t条件变量的完整示例

回复:
user: user-1
content: mutex和cm的加锁顺序不一致难道不会死锁吗？

user: user-2
content: 多谢大神啊，mark一下

user: user-3
content: 收藏一下吧，多谢
user-0 提问: 请问如何给双向链表中的指针数组，键盘输入字符串赋值

回复:
user: user-1
content: 供楼主参考，这里先malloc头结点的空间，然后每次能读到一个字符串就malloc一个字符串的空间  #include <stdlib.h> #include<iostream> #include <stdio.h> using namespace std; #define NULL 0    #define amount1 100            //结构体中*arr[]数组长度，用来定义扩充成员个数    typedef struct node {     struct node  *pre;            //指向前驱     char *arr[amount1];     struct node *next;            //指向后继 }NODE; NODE *head; int main() { 	head = (NODE *)malloc(sizeof(NODE)); 	int index = 0; 	char buffer[64] = {0}; 	while (scanf("%s",buffer) != EOF)      { 		head->arr[index] = (char *)malloc(strlen(buffer) + 1); 		strcpy(head->arr[index], buffer); 		printf("index = %s\n",head->arr[index]);         index++; 		if(getchar() == '\n')break;//读到输入的字符串的末尾了，结束循环     } 	system("pause"); 	return 0; }

user: user-1
content: 补充下上面的，这个是运行结果

user: user-2
content: 没人回答吗？ 你的char *arr[amount1]是个指针数组，每个元素都是指针。 你可以随意申请一个存储空间，比如char* pInput，C用malloc，C++用new，然后用scanf或者cin输入你想要的字符串，输入完毕后，把pInput存到arr里面去。比如第一个字符串，就是arr[0] = pInput。 使用完毕后，记得释放pInput的内存。
user-0 提问: 来源谭c语言switch和if应用的一个很好的例子！（没想到自己比谭教授写的还精简一些）特来分享一下！

回复:
user: user-1
content: 4楼的代码好靓！

user: user-2
content: 顶

user: user-3

user: user-4
content: 谭的代码好丑

user: user-5
content: 不错，多思考，书上的很多例子可以优化和改进，也可以添加新的功能。

user: user-0
content: 嗯嗯，学到了，但是谭c的这道题在前面，还没讲到数组。

user: user-1
content: #include<stdio.h> int main() {     int x,L,i;     char s[6];     scanf("%d",&x);     if(x<0 || 99999<x) {         printf("0<=x<=99999\n");         return 1;     }     L=sprintf(s,"%d",x);     printf("它是%d位数\n",L);     for (i=0;i<L;i++) printf("第%d位数是%c\n",i+1,s[i]);     printf("反序数字为");     for (i=L-1;i>=0;i--) printf("%c",s[i]);     printf("\n");     return 0; }

user: user-0
content: 第一次发有技术性的帖子，感谢！
user-0 提问: C语言 如何把十六进制数据转变为图片

回复:
user: user-1
content: 收藏一下楼上的，我倒是写过一个bin2hex的，主要是想包含二进制数据文件，用rc提取比较麻烦

user: user-2
content: 仅供参考：#include <stdio.h> #include <string.h> #include <conio.h> FILE *fi,*fo; int r; unsigned int n,c; long offset; //------------------------------------------------------- void main(int argc,char *argv[]) {     if (argc<3) {         cprintf("Hex2Bin srcfile desfile");         return;     }     if ((fi=fopen(argv[1],"rb"))==NULL) {         cprintf("Can not find file %s",argv[1]);         return;     }     if ((fo=fopen(argv[2],"wb"))==NULL) {         fclose(fi);         cprintf("Can not create file %s",argv[2]);         return;     }     n=0;     while (1) {         offset=ftell(fi);         r=fscanf(fi,"%2x",&c);         if (EOF==r) break;//         if (1==r) {             fputc(c,fo);             n++;         } else {//0==r             fseek(fi,offset,SEEK_SET);//因为VC6的Release版及其VC7,8,9,10,...版的fscanf未按约定保持offset不变，所以此处必须恢复offset             r=fgetc(fi);             if (EOF==r) break;//         }     }     fcloseall();     cprintf("OK to Hex2Bin %d bytes.",n); }

user: user-2
content: 引用 6 楼 ynsenyu 的回复:收藏一下楼上的，我倒是写过一个bin2hex的，主要是想包含二进制数据文件，用rc提取比较麻烦 #include <stdio.h> #include <string.h> #include <conio.h> FILE *fi,*fo; unsigned int n; int c; //------------------------------------------------------- void main(int argc,char *argv[]) {     if (argc<3) {         cprintf("Bin2Hex srcfile desfile");         return;     }     if ((fi=fopen(argv[1],"rb"))==NULL) {         cprintf("Can not find file %s",argv[1]);         return;     }     if ((fo=fopen(argv[2],"w"))==NULL) {         fclose(fi);         cprintf("Can not create file %s",argv[2]);         return;     }     n=0;     while (1) {         c=fgetc(fi);         if (EOF==c) break;         n++;         if (1==n)        fprintf(fo,  "0x%02X",c);         else {             if (1==n%16) fprintf(fo,"\n0x%02X",c);             else         fprintf(fo, ",0x%02X",c);         }     }     fcloseall();     cprintf("OK to Bin2Hex %u bytes.",n); }

user: user-3
content: 前两个字节为ffd8，说明这个已经是jpg格式了，只不过是将二进制的图片数据转存为了hex字符串。  直接从文件中读取这个字符串，写个hex2bin函数，将其转回成二进制格式即可。

user: user-1
content: 是裸rgba数据不？

user: user-4
content: txt文档保存图片？数据格式是什么？要转换到jpg也要知道jpg压缩格式。 格式转换一下，保存成文件。。。 http://blog.csdn.net/zhengzhoudaxue2/article/details/7693258 找找C中有没有对应转码的库，研究一下。 第一个图片会比较困难，但是一个完成以后下一个会好很多了
user-0 提问: c语言多重switch，最里面那层使用break，是跳出本层还是所有switc呢

回复:
user: user-1
content: break 退出当前层， return 退出当前函数 exit退出程序   goto跳到标签位置

user: user-2
content: 只是跳出本层

user: user-3
content: break;goto;return;throw;exit(1);taskkill;shutdown;拔电源插头;……

user: user-4
content: break只对循环语句有用，即switch  for while这些，对条件语句不起作用。 break只能跳出本循环，也即只能跳出一层。 想实现多层跳出可以自己用多个break加条件判断实现，也可以用goto语句。不过编码规范好像不建议用goto。

user: user-5
content: 如果想跳出多层循环除了用goto，再就自定义判断逻辑，一层层跳出。

user: user-6
content: break会直接跳出最内层的循环或switch语句块，不理睬if语句 break其作用大多情况下是终止上一层的循环，以C语言来说，break在switch（开关语句）中在执行一条case后跳出语句的作用。 1. break语句对if-else的条件语句不起作用。   2. 在多层循环中，一个break语句只向外跳一层。

user: user-7
content: break 只能跳出一层 switch 或者循环 如果是 if else break 是不管的。 他只管 switch 或者循环

user: user-8
content: 跳出本层，可以使用一些标志变量控制要跳出的层，或直接 goto ，一般不建议使用超过两层的 switch 。

user: user-0
content: 又试了一下for语句 #include <stdio.h> #include <stdlib.h> main() {int i=0;int j;     for(i=0;i<5;i++)         {for(j=0;j<5;j++)         if(j==0)break;}  printf("%d",i); } 也是只break最里层

user: user-0
content: #include <stdio.h> #include <stdlib.h> main() {     int a[]={2,3,5,4},i;     for(i=0;i<4;i++)     switch(i%2)     {case 0:switch(a[i]%2)        {case 0:a[i]++;break;         case 1:a[i]--;         };  case 1:a[i]=0; } for(i=0;i<4;i++)printf("%d",a[i]);printf("\n"); } 试了一下，里面的break只跳出里层
user-0 提问: 在dec-c++下搭建wpcap环境报错

回复:
user: user-1

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项 赵老师，我重下了winpcap包，重新配置了一下，现在好了！

user: user-1
content: 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt  Visual Studio 6/2005/2008/2010/2012/2013 各版本编译器 下载 http://bbs.csdn.net/topics/390812579 赵老师，我载了vc2010按网上的教程搭好了环境但是编译还是报错

user: user-1
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt  Visual Studio 6/2005/2008/2010/2012/2013 各版本编译器 下载 http://bbs.csdn.net/topics/390812579
user-0 提问: 我一直有个问题弄不懂,C是不支持多线程的，Linux内核是C标准写的，那它怎么支持多线程呢？

回复:
user: user-0
content: 引用 3 楼 chehw_1 的回复:多线程是操作系统的功能，这不是C语言要做的事。 C语言是用最简洁的语法来实现任意复杂的功能，包括让操作系统实现多线程支持。  “C语言本身不支持多线程，所以不能实现多线程“ 这种概念是错误的。 这就好比C语言本身虽然不支持“面向对象”和“模板”，但却可以用C来实际实现“面向对象”和“模板”。比如GTK+就是完全用C写出了“面向对象”编程的模式，包括实现类的继承；而gmp库，虽然是用C、汇编编写的，但大量使用来C方式的模板。  有些C标准库的函数在最初设计时可能不是线程安全的，这是因为在这些库最初写成的时候，还没发明出多线程的概念，由于在实现时使用了很多全局变量，加上函数声明的限制，后期也很难引入对多线程的支持。  比如rand()函数，早期使用了一个全局变量做为种子，所以该函数在多线程环境下一定是不安全的，由于该函数不附带任何参数，因此也无法简单的将其改成支持多线程。为了支持多线程，后期只能另外引入一个rand_r（）函数，多传递一个参数来用于同步。  也就是说，不是C不支持多线程，而是C的标准库中的一些函数未必支持多线程。这需要C程序员在多线程编程下自己格外注意这些库函数的使用，避免因为误用了某些多线程不安全的库函数而造成不可预知的后果。   大神，学习了!

user: user-1
content: 多线程是操作系统的功能，这不是C语言要做的事。 C语言是用最简洁的语法来实现任意复杂的功能，包括让操作系统实现多线程支持。  “C语言本身不支持多线程，所以不能实现多线程“ 这种概念是错误的。 这就好比C语言本身虽然不支持“面向对象”和“模板”，但却可以用C来实际实现“面向对象”和“模板”。比如GTK+就是完全用C写出了“面向对象”编程的模式，包括实现类的继承；而gmp库，虽然是用C、汇编编写的，但大量使用来C方式的模板。  有些C标准库的函数在最初设计时可能不是线程安全的，这是因为在这些库最初写成的时候，还没发明出多线程的概念，由于在实现时使用了很多全局变量，加上函数声明的限制，后期也很难引入对多线程的支持。  比如rand()函数，早期使用了一个全局变量做为种子，所以该函数在多线程环境下一定是不安全的，由于该函数不附带任何参数，因此也无法简单的将其改成支持多线程。为了支持多线程，后期只能另外引入一个rand_r（）函数，多传递一个参数来用于同步。  也就是说，不是C不支持多线程，而是C的标准库中的一些函数未必支持多线程。这需要C程序员在多线程编程下自己格外注意这些库函数的使用，避免因为误用了某些多线程不安全的库函数而造成不可预知的后果。

user: user-0
content: 引用 1 楼 user-2 的回复:线程的原理是把多个同时跑的代码段放在内核创建的一个队列中，快速的循环执行，从最底层来讲线程不可能是同步的。从应用层看一般都认为线程是同步的。应该就是这样理解吧。   哦哦，原来是这样，感谢指导!

user: user-2
content: 线程的原理是把多个同时跑的代码段放在内核创建的一个队列中，快速的循环执行，从最底层来讲线程不可能是同步的。从应用层看一般都认为线程是同步的。应该就是这样理解吧。
user-0 提问: 严重性	代码	说明	项目	文件	行 错误(活动)		不能将 "struct Student" 类型的值分配到 "struct Student" 类型的实体	ch

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

user: user-2
content: 编译器太老了吧

user: user-3
content: 严格来说没有写赋值操作符就不要直接赋值吧，用memcpy好些

user: user-4
content: 没什么问题啊
user-0 提问: 【C语言debug】for information on how your program can cause an assertion failure 

回复:
user: user-1
content: 这个题我也是服了，不让改动其他函数里的内容，结果文件指针fp指向的文件in.dat是只读的，然后文件在该路径下不存在。楼主可以改文件路径为  fp = fopen("in.dat","r") ; wf = fopen("out.dat","w") ; 考试应该不会出现这样的情况。

user: user-2
content: NONO函数中,这两句有问题 fp = fopen("c:\\test\\in.dat","r") ; wf = fopen("c:\\test\\out.dat","w") ; 打开失败了(不存在"c:\\test\\in.dat这个文件)，或者是没有权限在这个目录下写文件 楼主fopen以后应该判断下指针是否为NULL if(fp != NULL && wf != NULL){ .............. }

user: user-0
content: 下面调用文件时候路径不对
user-0 提问: c语言读取文件的问题。新手求助！！！

回复:
user: user-0
content: 谢谢大神 谢谢！！！！

user: user-1
content: 注释写在代码里了，相当于从一个文件里提取出碰到的第一组的连续的数字 比如一个文件: asd2358395bb 12312asd  运行结果：提取出的是2358395   #include <iostream> using namespace std; int Read_Num(FILE *fp)  { 	char temp[8]; //用来存储读到的数字字符 	int i=0; //用来记录当前字符数组的位置 	int stop=0; //标志是否读到了数字（仅读一组数字） 	char ch; //记录当前读到的字符 	while(!stop) 	{ 		ch=fgetc(fp); //读取一个字符 		if(ch==EOF)    //判断是否读到了文件尾 			break; 		while(ch>='0'&&ch<='9')//读到的是否是一个数字字符 		{ 			stop=1;//标志位置1 			temp[i++]=ch;//当前数字字符存到数组里，然后i+1 			ch=fgetc(fp);//继续读取字符 		} 	} 	temp[i]=0;//在当前数组最后填0 	return atol(temp);//将字符串转为长整数并返回 } int main() { 	FILE *fp; 	fp = fopen("E:\\out_1.txt", "r"); 	cout << Read_Num(fp) << endl; 	system("pause"); 	return 0; }
user-0 提问: C语言怎样把链表存入文件，然后从文件读取到链表

回复:
user: user-1
content: 自己去找下c如何读写文件的知识点看下。网上一堆

user: user-2
content: 仅供参考：//文件1: //编号12 23 34； //文件2： //编号 x y z //1 3.45 4.2 3.6 //2 2.45 4.2 3.6 //  ........ //277 4.00 8.38 9.92 //278 5.00 8.38 9.92 #include <stdio.h> FILE *f1,*f2,*f3; char ln[80]; int r,n,n2,n21; float x,y,z; int xyz_of_line(int nn,float *xx,float *yy,float *zz) {     n2=-1;//跳过第一行:编号 x y z     rewind(f2);     while (1) {         if (NULL==fgets(ln,80,f2)) break;         n2++;         if (n2==nn) {             r=sscanf(ln,"%d%f%f%f",&n21,xx,yy,zz);             if (4==r) {                 if (n21==nn) {                     return 1;                 } else {                     printf("WARNING:编号 error in line %4d:%s",nn,ln);                     return 1;                 }             } else {                 printf("ERROR:Format error in line %4d:%s",nn,ln);                 return 0;             }         }     }     return 0; } void main() {     f1=fopen("文件1","r");     if (NULL==f1) {         printf("ERROR:fopen 文件1 error!\n");         return;     }     f2=fopen("文件2","r");     if (NULL==f2) {         fclose(f1);         printf("ERROR:fopen 文件2 error!\n");         return;     }     f3=fopen("文件3","w");     if (NULL==f3) {         fclose(f2);         fclose(f1);         printf("ERROR:fopen 文件3 error!\n");         return;     }     while (1) {         r=fscanf(f1,"%d",&n);         if (1==r) {             r=xyz_of_line(n,&x,&y,&z);             if (1==r) {                 printf("%4d:x=%g,y=%g,z=%g\n",n,x,y,z);                 fprintf(f3,"%4d:x=%g,y=%g,z=%g\n",n,x,y,z);             } else {                 printf("ERROR:Can not read line %4d!\n",n);             }         } else if (0==r) {             fgetc(f1);         } else break;     }     fclose(f3);     fclose(f2);     fclose(f1); }

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:fprintf fscanf不是很懂额，我文件部分学的不好

user: user-2
content: fprintf fscanf
user-0 提问: 求解 关于char *p[100]

回复:
user: user-1
content: #include <stdio.h> char *p[5]; char d[5][6]={ {0,1,2,5,4,0,}, {0,0,5,4,4,0,}, {0,0,0,0,0,0,}, {1,1,1,1,1,1}, {5,5,5,5,5,5}, }; char num[30]; int x,i,j; int main() {     for (i=0;i<5;i++) p[i]=d[i];     x=0;     for(i=0;i<5;i++) {         for(j=0;j<6;j++) {             num[x]=p[i][j];             x++;         }     }     for (i=0;i<30;i++) printf("%d",num[i]);//012540005440000000111111555555     return 0; }

user: user-0
content: 那我怎么提取数据呢？

user: user-2
content: char *p[100] 这个是指针数组，每一个元素均为指针，每个指针都指向一个字符串
user-0 提问: hdu 2089 超时....

回复:
user: user-1
content: 不要重复处理。如果测试数据中有几个范围都是在1~10^6范围内就可能会超时了。下面的代码先进行预处理，参考下 #include <stdio.h> #include <string.h> int flag[1000010];  void preprocess() { 	char str[10] = { 0 }; 	int i = 0; 	for (i = 1; i <= 1000000; i++) 	{ 		sprintf(str, "%d", i); 		if (strstr(str, "62") || strstr(str, "4")) 		{ 			flag[i] = flag[i - 1]; 		} 		else 		{ 			flag[i] = flag[i - 1] + 1; 		} 	} }  int main() { 	memset(flag, 0, sizeof(flag)); 	int m, n; 	preprocess(); 	while (scanf("%d%d", &n, &m) != EOF) 	{ 		if (n == 0 && m == 0)break; 		printf("%d\n", flag[m]  - flag[n-1]); 	} 	return 0; }

user: user-0
content: 不对哦qaqaqa

user: user-2
content: while(scanf("%d %d",&n,&m)!=EOF) 应改为 while(scanf("%d%d",&n,&m)==2)
user-0 提问: 我的C++程序调试时出现“Program received signal SIGSEGV，Segmentation fault.”是什么原因，求指导。

回复:
user: user-1
content: 双引号位置错了，scanf("%4d/%2d/%2d,&iYear,&iMonth,&iDay");改为scanf("%4d/%2d/%2d",&iYear,&iMonth,&iDay);

user: user-1
content: 有几个问题： 1.scanf处双引号，上面已经说了 2.case和后面的数字要分开 3.if((iYear % 4 == 0) && (iYear % 100 != 0) || (iYear % 400 == 0))后面不应该加分号，而且应该加上else  #include<iostream> using namespace std;  int main(){ 	int iYear,iMonth,iDay,iDays;bool bFlag=true; 	cout<<"请输入日期（年/月/日)："<<endl; 	scanf("%4d/%2d/%2d",&iYear,&iMonth,&iDay); 	switch(iMonth) 	{ 	case 1:; 	case 3:; 	case 5:; 	case 7:; 	case 8:; 	case 10:; 	case 12:iDays=31;break; 	case 4:; 	case 6:; 	case 9:; 	case 11:iDays=30;break; 	case 2: if((iYear % 4 == 0) && (iYear % 100 != 0) || (iYear % 400 == 0)) iDays=29; 			else iDays=28;break; 	default:bFlag=false; 	} 	if(bFlag) 		cout<<"此日期对应月的天数是："<<iDays<<endl; 	else 		cout<<"输出错误："<<endl;  	system("pause"); }

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

user: user-0
content: 改了，还是显得那个
user-0 提问: 怎么看待以下代码片？？？

回复:
user: user-0
content: 明白了，未定义行为问题。。。。

user: user-1
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-0
content: 引用 9 楼 小灸舞的回复:参考下：http://www.cnblogs.com/chenyg32/p/3708164.html 这个也没必要研究，自己都没法知道输出啥结果来 确实，写程序的时候避开这样的问题就好了。 不研究编译器的话，就了解了解当增长见识好了，不必深究。。。

user: user-2
content: 引用 8 楼 IAYXNS 的回复:表达式求值顺序问题 可以参考下面两篇文章 http://m.blog.csdn.net/article/details?id=37833767  http://bbs.csdn.net/wap/topics/370153775  话说csdn客户端上怎么结帖，不能让类问题继续祸害别人了，病毒一样的存在。。。  关于C,C++表达式求值顺序  http://bbs.csdn.net/topics/370153775

user: user-0
content: 表达式求值顺序问题 可以参考下面两篇文章 http://m.blog.csdn.net/article/details?id=37833767  http://bbs.csdn.net/wap/topics/370153775  话说csdn客户端上怎么结帖，不能让类问题继续祸害别人了，病毒一样的存在。。。

user: user-3
content: 参考下：http://www.cnblogs.com/chenyg32/p/3708164.html 这个也没必要研究，自己都没法知道输出啥结果来

user: user-4
content: 引用 5 楼 IAYXNS 的回复:[quote=引用 3 楼 小灸舞的回复:]这题主要有两个知识点： 1.printf的顺序是自右向左（会有压栈操作） 2.前++和后++的区别(不仅仅是先加1再计算，和先计算再加1的区别，还涉及是否是引用的区别) 第一步执行++a,由于是前++，所以先将a的值加1（a变为了6），再将a压栈（注意！是将a的引用压栈，而非6这个数字） 此时栈中为（从栈底开始）是a 第二步执行a,将a压栈（此时是a的引用，而非6这个数字），此时栈中为（从栈底开始）是a,a 第三步执行a++,由于是后++,(注意了，后++是将数字压栈，而非a的引用)，所以将6这个数字压栈，然后执行a=a+1(此时a为7) 此时栈中为（从栈底开始）是a,a,6 第四步执行a,将a压栈（此时是a的引用，而非7这个数字），此时栈中为（从栈底开始）是a,a,6,a 然后格式化输出，出栈顺序为a,6,a,a(此时的a是7) 所以输出的是7，6，7，7  注：楼主也不必要太纠结于结果，因为不同的编译器可能结果不同 看得似懂非懂，看来我还是功力不够啊[/quote] VS2015 输出 6,6,6,6 G++ 5.3输出 7,6,7,7 intel C++输出 7,5,7,7 这些结果都是合法的。 编译器可以自由处理未定义行为。

user: user-5
content: 引用 3 楼 qq423399099 的回复:这题主要有两个知识点： 1.printf的顺序是自右向左（会有压栈操作） 2.前++和后++的区别(不仅仅是先加1再计算，和先计算再加1的区别，还涉及是否是引用的区别) 第一步执行++a,由于是前++，所以先将a的值加1（a变为了6），再将a压栈（注意！是将a的引用压栈，而非6这个数字） 此时栈中为（从栈底开始）是a 第二步执行a,将a压栈（此时是a的引用，而非6这个数字），此时栈中为（从栈底开始）是a,a 第三步执行a++,由于是后++,(注意了，后++是将数字压栈，而非a的引用)，所以将6这个数字压栈，然后执行a=a+1(此时a为7) 此时栈中为（从栈底开始）是a,a,6 第四步执行a,将a压栈（此时是a的引用，而非7这个数字），此时栈中为（从栈底开始）是a,a,6,a 然后格式化输出，出栈顺序为a,6,a,a(此时的a是7) 所以输出的是7，6，7，7  注：楼主也不必要太纠结于结果，因为不同的编译器可能结果不同除了 最后一句话 其他全部说错了 请不要误导其他人

user: user-0
content: 引用 3 楼 小灸舞的回复:这题主要有两个知识点： 1.printf的顺序是自右向左（会有压栈操作） 2.前++和后++的区别(不仅仅是先加1再计算，和先计算再加1的区别，还涉及是否是引用的区别) 第一步执行++a,由于是前++，所以先将a的值加1（a变为了6），再将a压栈（注意！是将a的引用压栈，而非6这个数字） 此时栈中为（从栈底开始）是a 第二步执行a,将a压栈（此时是a的引用，而非6这个数字），此时栈中为（从栈底开始）是a,a 第三步执行a++,由于是后++,(注意了，后++是将数字压栈，而非a的引用)，所以将6这个数字压栈，然后执行a=a+1(此时a为7) 此时栈中为（从栈底开始）是a,a,6 第四步执行a,将a压栈（此时是a的引用，而非7这个数字），此时栈中为（从栈底开始）是a,a,6,a 然后格式化输出，出栈顺序为a,6,a,a(此时的a是7) 所以输出的是7，6，7，7  注：楼主也不必要太纠结于结果，因为不同的编译器可能结果不同 看得似懂非懂，看来我还是功力不够啊

user: user-0
content: 引用 2 楼 user-6的回复:5.5.6.7有什么看待的 你去运行试试

user: user-3
content: 这题主要有两个知识点： 1.printf的顺序是自右向左（会有压栈操作） 2.前++和后++的区别(不仅仅是先加1再计算，和先计算再加1的区别，还涉及是否是引用的区别) 第一步执行++a,由于是前++，所以先将a的值加1（a变为了6），再将a压栈（注意！是将a的引用压栈，而非6这个数字） 此时栈中为（从栈底开始）是a 第二步执行a,将a压栈（此时是a的引用，而非6这个数字），此时栈中为（从栈底开始）是a,a 第三步执行a++,由于是后++,(注意了，后++是将数字压栈，而非a的引用)，所以将6这个数字压栈，然后执行a=a+1(此时a为7) 此时栈中为（从栈底开始）是a,a,6 第四步执行a,将a压栈（此时是a的引用，而非7这个数字），此时栈中为（从栈底开始）是a,a,6,a 然后格式化输出，出栈顺序为a,6,a,a(此时的a是7) 所以输出的是7，6，7，7  注：楼主也不必要太纠结于结果，因为不同的编译器可能结果不同

user: user-6
content: 5.5.6.7有什么看待的
user-0 提问: 求浮点数的实际储存（有效位数以后的）是不是也是保存了一定精度的呢？

回复:
user: user-1
content: 浮点数存的不是二进制分数，而是二进制的科学计数法

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

user: user-3
content: 通常程序实现是 显示时会是存储值的近似值，而且之后用的仍然是原来存储的值

user: user-4
content: 显示的时候，经过了一次 二进制 浮点数，到 10进制 ASCII码 小数（浮点数）的转换 和保存的并不相同 至于 保存的值 是多少 可以按照浮点数二进制格式，查看一下 不必去猜测 虽然不同平台可能不同，但也比猜测靠谱。 至少了解一种实现方式是多少，怎么做的 。

user: user-5
content: 实际保存的可能是二进制的 13421773/134217728 。  显示出来的和保存的两码事。（这里有一次进制转换，和近似）但是显示不会影响实际保存的值。
user-0 提问: if 和 else 语句都被执行，并且在 if 和 else 语句中打印同一个由键盘获得的字符串，打印结果不同

回复:
user: user-0
content: 明白了，谢谢大家的解答，麻烦了

user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-2
content: 估计是第二次循环进的else，是问题最适合楼主单步跟踪去发现了

user: user-3
content: 稍微分析下： 1.输入0+回车（输入缓冲区变成0\n） 2.fgets(me, 10, stdin); //fgets会连换行符也读走(此时me读走了0和回车),输入缓冲区变为NULL 3.判断strstr(me, "0") //结果为true 4.printf("输入时间类型："); 5.scanf("%d", &num); //输入0+回车（输入缓冲区变成0\n）,注意了！！！scanf是不会读走回车的，此时输入缓冲区变成了\n 6.if(!num)为true 7.printf("me 是 %s\n", me); 打印 8.由于此时输入缓冲区不为NULL，所以继续执行fgets(me, 10, stdin);(me读走了剩余的回车) 9.if(strstr(me, "0"))为false 10.执行else分支，printf("me 是 %s\n", me);  注：所以楼主感觉if和else都执行了，其实第二次并不是NULL，而是读取遗留下来的回车符，无论去掉while(1)还是fgets都只会执行了一次，也就是说第8-10步都不会执行了，自然不会执行else分支了 所以问题出在scanf这里，楼主可以将scanf("%d", &num);改为scanf("%d%*c", &num);//用%*c匹配掉遗留下来的回车符
user-0 提问: c语言命令行。新手求助！！！

回复:
user: user-1
content: 引用 12 楼 w_1239729535yq 的回复:[quote=引用 11 楼 zhao4zhong1 的回复:] 为什么不 cd Clanguage ..\p376-5 I file.txt 呢?= =为什么 这样就可以了 好神奇。[/quote] 弄清楚啥叫“当前目录”。

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:为什么不 cd Clanguage ..\p376-5 I file.txt 呢?= =为什么 这样就可以了 好神奇。

user: user-2
content: 引用 8 楼 w_1239729535yq 的回复:引用 7 楼 trytry1992 的回复:把绝对路径加上去因为回显的是 can't open file 所以 路径应该没问题  因为尝试着读取 才会显示都不出来 。。不知道为什么  哭  回显的是你自己输入的内容，你甚至可以在打开失败时输出打开成功，检查路径是否正确  http://en.cppreference.com/w/c/io/fopen

user: user-0
content: 引用 7 楼 trytry1992 的回复:把绝对路径加上去因为回显的是 can't open file 所以 路径应该没问题  因为尝试着读取 才会显示都不出来 。。不知道为什么  哭

user: user-3
content: 把绝对路径加上去

user: user-1
content: 为什么不 cd Clanguage ..\p376-5 I file.txt 呢?

user: user-4
content: 明显路径不对，这种问题就该先把全路径去调试。

user: user-5
content: 引用 5 楼 w_1239729535yq 的回复:引用 4 楼 zhangxiangDavaid 的回复:把file.txt和执行文件放在一起已经放在一起了  执行就这样  你确定不是.c文件/

user: user-0
content: 引用 4 楼 zhangxiangDavaid 的回复:把file.txt和执行文件放在一起已经放在一起了  执行就这样

user: user-5
content: 把file.txt和执行文件放在一起

user: user-0

user: user-0

user: user-0
user-0 提问: C链表文件信息管理--代码正确，执行直接结束？

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

user: user-2
content: 据我分析，你的main函数内，top它只是个地址，又没分配具体空间，下面的函数确一直在用top，给star分配了空间一次都没用，把top=star吧。
user-0 提问: c语言结构体数组中如何输入不限个数的数组

回复:
user: user-1
content: 结构体变长的妙用——0个元素的数组  typedef struct st_type  {  int nCnt;  int item[];  }type_a;   这样我们就可以定义一个可变长的结构，用sizeof(type_a)得到的只有4，就是sizeof(nCnt)=sizeof(int)那个0个元素的数组没有占用空间，而后我们可以进行变长操作了。   type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));   这样我们就产生了一个长为100的type_a类型的东西用p-> item[n]就能简单地访问可变长元素，原理十分简单，分配了比sizeof(type_a)多的内存后int item[];就有了其意义了，它指向的是int nCnt;后面的内容，是没有内存需要的，而在分配时多分配的内存就可以由其来操控，是个十分好用的技巧。

user: user-2
content: malloc, realloc自己封装一个结构体。假设你存放数据的结构体的struct elem 则这样定义一个结构体 struct array  { struct elem *data; int size; int capacity; }; size为已存放的数据长度， capacity为可用空间。 每次发现size == capacity时，就realloc, 增大空间。 再定义一些操作，比如push_back
user-0 提问: linux中c语言中的int指针

回复:
user: user-1
content: 别人的虚拟机可以用的话，证明程序应该是没有问题的，你要不要试试重新安装一下虚拟机试试看啊，没准是虚拟机的问题不是程序问题，我这边也帮你测试一下。或者你可以直接私信我

user: user-2
content: 虚拟机也分16位、32位、64位吧。
user-0 提问: 很简单的问题

回复:
user: user-1
content: 控制台只能显示一部分，这很容易想到……

user: user-2
content: 控制台行数不是无限的，超过后之前的内容就没了

user: user-3
content: 内容太多，控制台上面还有，只是无法恢复显示了。
user-0 提问: 中缀表达式转换为后缀表达式，求大神帮忙找错，

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

回复:
user: user-1
content: 引用 4 楼 baidu_28726667 的回复:[quote=引用 2 楼 qq423399099 的回复:] 只有f2是对的 f1返回的是局部变量的地址，在函数结束时，生命周期就结束了，你取一个生命周期结束的地址所对应的值，结果是不确定的 f3中ptr指针你不初始化，它里面存了一个未知的值（地址），你将那个地址所对应的值修改成5，极有可能触发异常（因为该地址对应的区域可能无法访问） return &x一样的 return (&x)  我改了下 f1的返回值不是指针只是int 的话。直接return x; 这样是不会警告的。跟返回指针有什么不同？变量和指针在函数结束后都会消失吧。为何指针的会warning?[/quote] C/C++里如int类型的返回值是复制出去的，和函数内的x不是同一个，只是值相同而已，而返回指针却是返回同一个指针

user: user-0
content: 引用 2 楼 qq423399099 的回复:只有f2是对的 f1返回的是局部变量的地址，在函数结束时，生命周期就结束了，你取一个生命周期结束的地址所对应的值，结果是不确定的 f3中ptr指针你不初始化，它里面存了一个未知的值（地址），你将那个地址所对应的值修改成5，极有可能触发异常（因为该地址对应的区域可能无法访问） return &x一样的 return (&x)  我改了下 f1的返回值不是指针只是int 的话。直接return x; 这样是不会警告的。跟返回指针有什么不同？变量和指针在函数结束后都会消失吧。为何指针的会warning?

user: user-2
content: f1返回的是局部变量10，f1结束，变量10也就消失了  return &x 跟 return (&x)在这里是一样的  如果是个表达式就不一样了

user: user-1
content: 只有f2是对的 f1返回的是局部变量的地址，在函数结束时，生命周期就结束了，你取一个生命周期结束的地址所对应的值，结果是不确定的 f3中ptr指针你不初始化，它里面存了一个未知的值（地址），你将那个地址所对应的值修改成5，极有可能触发异常（因为该地址对应的区域可能无法访问） return &x一样的 return (&x)

user: user-3
content: f3指针未初始化，可能是任意值，如果没有 *ptr=5; 也算正确，没有语法错误，但是加了这句就是作死了。  f1虽然可能导致错误，但是你不用返回值就没事  最后 ， 1 + 1 和 (1 + 1) 一样么
user-0 提问: [c菜鸟求助]制作旅店信息管理系统怎样用递归创建链表然后全部储存进文件，并且以后还能读取？

回复:
user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: 是不是因为p1，p2枚释放
user-0 提问: 3种数组赋值有什么区别呢？

回复:
user: user-1
content: “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

user: user-2
content: p1和p2完全一样，是结尾有\0，是char[7]类型 p3结尾没\0，你用strlen得到的结果是不确定的，p3是char[6]类型

user: user-3
content: strlen 用于以零结尾的字符串，p3 不是以零结尾的字符串。  你违反了协议，就不要期望得到有意义的结果。

user: user-4
content: 字符串会在末尾多存储一个’\0‘，用于判断字符串结束，但'\0'不属于字符串中的字符 sizeof是用来计算变量占的内存空间，strlen是用来计算字符串长度的（不计算’0‘） 至于 char p3[]={'a','b','c','d','e','f'}; strlen(p3) //该值是个不确定值，与编译器，机器字节序等有关，strlen会根据'\0'判断字符串结束，p3中没有该字符，所以会在p3所在内存区，继续往后搜寻'\0'

user: user-5
content: 字符串和字符数组有区别，字符串以字符数组的形式存储，末尾自动加'\0'。p3赋值不能这样写，要显式写上末尾的0。
user-0 提问: C语言和汇编后对应不上

回复:
user: user-1
content: 在DEBUG下运行程序

user: user-0
content: 引用 1 楼 user-2 的回复:关闭优化试试，你要相信编译的的黑魔法优化 谢谢！ 但是，我用的codewarrior10.6 ，已经关闭了C语言和汇编的所有优化，只是因为用了BANK，所以开了默认的MMU优化没有关闭，还需要在哪里关闭优化么？

user: user-2
content: 关闭优化试试，你要相信编译的的黑魔法优化
user-0 提问: 如何用c语言给定义过的结构体增加成员

回复:
user: user-1
content: 引用 4 楼 u013179272 的回复:请问，如果这样 struct student{  char name[20];  int age;  char sex;  int weight;  void *attr;  };  给这个里面增加N个不确定的变量，  其他地方给这N个变量赋值，怎么处理呢？ 用版主说的方法2，void*链接过去是最好的方法。 他的方法3会产生4200警告，不是最好的方案。

user: user-2
content: 请问，如果这样 struct student{  char name[20];  int age;  char sex;  int weight;  void *attr;  };  给这个里面增加N个不确定的变量，  其他地方给这N个变量赋值，怎么处理呢？

user: user-3
content: 引用 2 楼 jyxuan94 的回复:[quote=引用 1 楼 qq423399099 的回复:] 有几个思路，LZ可以参考下 1.添加一些多余的成员（也就是说，不管是否需要，都添加进去）  2.另外添加指针（如void *, 根据需要动态产生attr的结构）  struct student{  char name[20];  int age;  char sex;  int weight;  void *attr;  };   3.结构体变长的妙用——0个元素的数组  typedef struct st_type  {  int nCnt;  int item[];  }type_a;   这样我们就可以定义一个可变长的结构，用sizeof(type_a)得到的只有4，就是sizeof(nCnt)=sizeof(int)那个0个元素的数组没有占用空间，而后我们可以进行变长操作了。   type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));   这样我们就产生了一个长为100的type_a类型的东西用p-> item[n]就能简单地访问可变长元素，原理十分简单，分配了比sizeof(type_a)多的内存后int item[];就有了其意义了，它指向的是int nCnt;后面的内容，是没有内存需要的，而在分配时多分配的内存就可以由其来操控，是个十分好用的技巧。   注：如果可以用C++，不妨可以用多态试试    谢谢大大，有几个问题想问下，因为大多时候录入的都是字符串，而c没有string类型，多数的时候用的是二维数组，或者指针数组，那么方法2是不是改成 void *arr[100],如果是，赋值的时候是*（arr+i）的形式还是a[i]比较好 方法三是不是这样就可以了： typedef struct st_type  {  int nCnt;  char item[][100];  }type_a;  type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));  [/quote] 方法2：可以用指针数组的形式void *arr[100];   type_a a; a.arr[0] = (char *)("asdads"); cout << (char *)a.arr[0] << endl;  方法3： type_a *p = (type_a *)malloc(sizeof(type_a) +  5 * 100 * sizeof(char)); strcpy(p->item[0], "asd"); cout << p->item[0] << endl;

user: user-0
content: 引用 1 楼 qq423399099 的回复:有几个思路，LZ可以参考下 1.添加一些多余的成员（也就是说，不管是否需要，都添加进去）  2.另外添加指针（如void *, 根据需要动态产生attr的结构）  struct student{  char name[20];  int age;  char sex;  int weight;  void *attr;  };   3.结构体变长的妙用——0个元素的数组  typedef struct st_type  {  int nCnt;  int item[];  }type_a;   这样我们就可以定义一个可变长的结构，用sizeof(type_a)得到的只有4，就是sizeof(nCnt)=sizeof(int)那个0个元素的数组没有占用空间，而后我们可以进行变长操作了。   type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));   这样我们就产生了一个长为100的type_a类型的东西用p-> item[n]就能简单地访问可变长元素，原理十分简单，分配了比sizeof(type_a)多的内存后int item[];就有了其意义了，它指向的是int nCnt;后面的内容，是没有内存需要的，而在分配时多分配的内存就可以由其来操控，是个十分好用的技巧。   注：如果可以用C++，不妨可以用多态试试    谢谢大大，有几个问题想问下，因为大多时候录入的都是字符串，而c没有string类型，多数的时候用的是二维数组，或者指针数组，那么方法2是不是改成 void *arr[100],如果是，赋值的时候是*（arr+i）的形式还是a[i]比较好 方法三是不是这样就可以了： typedef struct st_type  {  int nCnt;  char item[][100];  }type_a;  type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));

user: user-3
content: 有几个思路，LZ可以参考下 1.添加一些多余的成员（也就是说，不管是否需要，都添加进去）  2.另外添加指针（如void *, 根据需要动态产生attr的结构）  struct student{  char name[20];  int age;  char sex;  int weight;  void *attr;  };   3.结构体变长的妙用——0个元素的数组  typedef struct st_type  {  int nCnt;  int item[];  }type_a;   这样我们就可以定义一个可变长的结构，用sizeof(type_a)得到的只有4，就是sizeof(nCnt)=sizeof(int)那个0个元素的数组没有占用空间，而后我们可以进行变长操作了。   type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));   这样我们就产生了一个长为100的type_a类型的东西用p-> item[n]就能简单地访问可变长元素，原理十分简单，分配了比sizeof(type_a)多的内存后int item[];就有了其意义了，它指向的是int nCnt;后面的内容，是没有内存需要的，而在分配时多分配的内存就可以由其来操控，是个十分好用的技巧。   注：如果可以用C++，不妨可以用多态试试
user-0 提问: 很简单的帮忙看看，这段代码可以计算所输入整数的阶乘吗？

回复:
user: user-1
content: 仅供参考：#include<stdio.h> #define N 1000    //要计算的N long s[N]={1,1},n=N,t=2,a=1,b=0; int main()//雨中飞燕之作 {     for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)         s[a]=(b+=s[a]*t)%10000,b/=10000;     for(printf("%d",s[*s]);--*s>0;) printf("%04d",s[*s]);     return 0; }

user: user-2
content: scanf("%d",n);应该改成scanf("%d",&n); 楼主还要注意，由于是用int存的，当阶乘太大的时候是会超出int范围的，计算出来的结果是不对的 int范围是- 2^31 ~ 2^31 - 1 （也就是说在12!到13!之前，超过12!就无法用int表示了，楼主可以考虑用char数组存大数）
user-0 提问: 使用vs编程中出现错误求解

回复:
user: user-1
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-2
content: Readscore    s大写

user: user-2
content: 引用 3 楼 baidu_34326351 的回复:int Readscore(int score[]) { 	int i = -1; 	do { 		i++; 		printf("Input score:"); 		scanf_s("%d", &score[i]);  	} while (score[i] >= 0); 	return i; } 查看全部的这个函数  大小写对应

user: user-0
content: int Readscore(int score[]) { 	int i = -1; 	do { 		i++; 		printf("Input score:"); 		scanf_s("%d", &score[i]);  	} while (score[i] >= 0); 	return i; }

user: user-0
content: 哪里错了呢！

user: user-2
content: ReadScore怎么定义的

user: user-0
content: 秒沉？？！！！
user-0 提问: 小弟新人，请问这种写法是什么意思？

回复:
user: user-0
content: 谢谢哦，谢谢哦

user: user-1
content: 取指定地址上的4字节整型值。 就是把一个常量数值地址强制转为成指针int32指针，再用星号取其值。
user-0 提问: 不允许强制装换到类型P

回复:
user: user-0
content: 谢了！原来是编译器的问题，我重启后就可以了

user: user-1
content: 引用 2 楼 Never_Setttle 的回复:那应该怎么改  ip = (P)malloc(sizeof(P));

user: user-0
content: 那应该怎么改

user: user-1
content: 你的P相当于是struct info*类型 而你malloc的大小是struct info类型的大小
user-0 提问: 嵌入式C语言能够使用句柄吗？

回复:
user: user-1
content: 引用 11 楼 modyhank 的回复:其实不太明白结构体指针的内存是怎么分配的， 如果是分配一个内存块，那么句柄也是一个内存块，两者应该是等价的啊。  “句柄”一词容易引起歧义，很可能被认为是Windows下的HANDLE概念。（所以尽量避免不要这么写） Windows下的HANDLE表示该"句柄“对应的内存是由操作系统来维护，该内存不是你分配的，你自己也不能随便释放，需要通过系统调用（比如CloseHandle等，具体要看是什么类型的HANDLE），由系统来维护。  普通的指针指向的内存很多是由程序员自己从堆上分配的，此时程序员需要自己去释放该内存。

user: user-1
content: 引用 9 楼 modyhank 的回复:其实我想问的是这这样定义的区别是什么，大家都讨论句柄去了，应该是我表达出了问题； 我的理解是： test_Obj是一个结构体数据类型，test2 是一个结构体指针， test_Handle是一个数据类型， 这样定义：test_Handle    test2   应该就是等同于这样定义 test_Obj     *test2。 ------------------------------------------------------------------------------------------------------------- 但是我第二次回复的那段代码， 类型之间的转换好绕口啊，无法理解。  你第二次回复中的代码书写本身有问题，不要纠结于垃圾代码为什么要这么书写。

user: user-0
content: 其实不太明白结构体指针的内存是怎么分配的， 如果是分配一个内存块，那么句柄也是一个内存块，两者应该是等价的啊。

user: user-0
content: typedef struct {  word A;  word B; }test_Obj; test_Obj   *test2;  //  test2 是结构体指针 typedef     test_Obj     *test_Handle; --------------------------------------------------------- 其实我想问的是这这样定义的区别是什么，大家都讨论句柄去了，应该是我表达出了问题； 我的理解是： test_Obj是一个结构体数据类型，test2 是一个结构体指针， test_Handle是一个数据类型， 这样定义：test_Handle    test2   应该就是等同于这样定义 test_Obj     *test2。 ------------------------------------------------------------------------------------------------------------- 但是我第二次回复的那段代码， 类型之间的转换好绕口啊，无法理解。

user: user-0
content: 引用 6 楼 jiqiang01234 的回复:句柄其实就是用“结构体指针”实现的。所以，只要是c语言就能用 -------------------------------------------------  头像好像我的一位大学老师啊

user: user-2
content: 句柄可以看成是系统底层指向某数据结构的指针数组的下标，我觉得。

user: user-3
content: 句柄其实就是用“结构体指针”实现的。所以，只要是c语言就能用

user: user-4
content: 句柄其实就是用“结构体指针”实现的

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:啥叫“句柄”？  语法是没有问题的，编译器可以通过，没有句柄这个说法吗？ 我感觉这样写的目的可以增强可读性吧，不然形参传递的时候结构指针就可以了。  这是老外的一段代码里面看到的，大体结构是这样： test_Handle   Process (void *p,const word counts) {    test_Handle     testhandle;    test_Obj *TestObj;     testhandle = (test_Handle) p;    TestObj = (test_Obj *) testhandle ;     memset(TestObj,0,sizeof(test_Obj ));        return (testhandle);  }

user: user-5
content: 句柄是操作系统内核的资源分配方式、、   实际中也是个结构体、、      这么管理没有问题

user: user-2
content: 啥叫“句柄”？

user: user-6
content: 没问题啊，编译器能处理指针和结构体，怎么定义都OK 类似用c写面向对象的代码也很多，但是实际上封装、继承等都不是非常好

user: user-7
content: 没有这个说法吧，没见过这么定义的
user-0 提问: 这个代码是老师给的，输入正确，输出的后两位数不对

回复:
user: user-1
content: 看楼上几位，学习了

user: user-2
content: 检查字符串是否以\0结尾，否则输出时会一直输出到\0，而DEBUG下，栈会用0xCC进行填充，所以会输出烫字

user: user-3
content: i=atoi(strNo);  前 面加上 strNo[i] = '\0'; 不过，strNo至少要有11个元素空间

user: user-4
content: 引用 1 楼 Y_noo 的回复:输出总有烫，不知问题出在哪里 编译器设成UTF_8格式

user: user-0
content: 输出总有烫，不知问题出在哪里
user-0 提问: 运行时总有一个错误 'int86' : undeclared identifier

回复:
user: user-1
content: DOS下的程序

user: user-2
content: 是不是少包含了什么头文件，看看int86在哪里

user: user-3
content: bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028

user: user-4
content: 转到int86定义看看
user-0 提问: 请大神详细描述下dfs ，真的不是很懂，为什么这个题目里边调用dfs后vis[i]要置为0呢

回复:
user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-2
content: vis的下标表示要填的数,值表示是否填了,先尝试把数字填入之后又取回.就像走迷宫,每个路口有两条路,每一条路都尝试走一遍(vis[i]置1),走到头发现不通就回来(vis[i]置0)
user-0 提问: c语言实现图片复制

回复:
user: user-1
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-2
content: fp1=fopen("d:\\cs\\cs.jpg","wt++") 改成  fp1=fopen("d:\\cs\\cs.jpg","wb++") 试下。以前也遇到过类似情况，对于图片的写入好像要用二进制方式写。

user: user-3
content: http://www.cplusplus.com/reference/cstdio/fopen/

user: user-0
content: 我的电脑是win7 32位，难道是系统的问题吗？

user: user-4
content: 代码基本没做修改  #include<stdio.h> #include<stdlib.h>  int main(){     FILE *fp;     FILE *fp1;      char str[256];     scanf("%s",str);     if((fp=fopen(str,"rb+")) == NULL)     {         printf("ERROR");         exit(1);     }      if((fp1=fopen("2.jpg","wt++")) ==NULL)     {         printf("error1");         exit(1);     }     fseek(fp,0L,SEEK_END);     long length;     long n,cpyfinish;     length = ftell(fp);     rewind(fp);      char pBuffer[1]={0}; //    unsigned char buff;   //while (!feof(fp))     while(length>0)     {         n = fread(pBuffer, 1, 1, fp);         cpyfinish =fwrite(pBuffer, 1, n, fp1);         length-=cpyfinish;     }       if(ferror(fp))         puts("读取出错");     else         puts("读取成功");      fclose(fp);     fclose(fp1);      return 0; }
user-0 提问: 不知是关于“自增”还是printf顺序结构的问题

回复:
user: user-1
content: 这是在同一条语句中，属于未定义行为，编译器可以自由实现  关于C,C++表达式求值顺序  http://bbs.csdn.net/topics/370153775

user: user-2
content: 参见函数参数压栈的顺序

user: user-3
content: 这种结果其实很看编译器的脸 比如第二个，我用VS2012打印出来就是2 1 总体来说有几个点： 1.printf计算顺序是从右往左的 2.我们在写代码时，应该尽量避免类似下面的无确定意义的表达式出现，因为很有可能不同的编译器，会采用不同的理解方式。
user-0 提问: linux下不用读写锁，实现读者-写者？

回复:
user: user-1
content: 楼上回答的很经典

user: user-2
content: int flag=0； if（!flag） { //读取 flag=1; } if(flag) { //写 flag=0; }

user: user-0
content: 引用 1 楼 yuelengdihai 的回复:信号量和互斥体 锁本质是一样的啊   有没有我要的例子，有点花，贡献个链接也行啊，我插了很久，找不到

user: user-2
content: 信号量和互斥体 锁本质是一样的啊
user-0 提问: 这两个段代码的test函数差异在于是否赋值，结果差异这么大是为什么？？？

回复:
user: user-1
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-2
content: 修改一下 test1 输出 d 的地址，你会发现，地址没有变化 this is test1,&d =00000000009ffddc,d=0,c=1 this is test1,&d =00000000009ffddc,d=1,c=2 this is test1,&d =00000000009ffddc,d=2,c=3 this is test2,a=1,b=1 this is test2,a=1,b=2 this is test2,a=1,b=3

user: user-2
content: 在循环中每次调用 test1的时候 d 分配在同一个位置 第一次 d=0 是不确定的 以后 d 没被破坏的话，可以保持上次的值 但是这个显然是巧合，而不是必然的。 这跟 d没有初始化，也没赋值,d 的值不确定，没有任何冲突。。。

user: user-3
content: d应该是一个局部变量，为啥d的值会像静态变量一样保持下来？

user: user-4
content: 引用 2 楼 u012405375 的回复:两函数的差异void test1()  的int d; 和void test2()int a=1;   然后得出的两个结果d=0,1,2和a=1,1,1   --------这个要怎么解释呢  引用 1 楼 user-4 的回复:static int c=1; 只是在第一次时初始化，之后并不会执行c=1操作，而是保留上一次调用后的值  哪里不懂！静态变量不会随函数结束而销毁！

user: user-0
content: 两函数的差异void test1()  的int d; 和void test2()int a=1;   然后得出的两个结果d=0,1,2和a=1,1,1   --------这个要怎么解释呢  引用 1 楼 user-4 的回复:static int c=1; 只是在第一次时初始化，之后并不会执行c=1操作，而是保留上一次调用后的值

user: user-4
content: static int c=1; 只是在第一次时初始化，之后并不会执行c=1操作，而是保留上一次调用后的值
user-0 提问: C语言发送http get请求源码的问题

回复:
user: user-1
content: 网站不允许这样访问，加上agent试试

user: user-2
content: 使用wireshark抓包，先在浏览器中打开，看抓到的包。再用你自己的程序发送，抓包看有什么不同。
user-0 提问: C语言数组问题

回复:
user: user-1
content: 整形提升  有什么问题么

user: user-2
content: 在C#中都TM属于越界了  有啥用， 就算编译完善  也是一大堆破问题

user: user-3
content: int 与 char字符直接有对应关系。看看ASCII码表就明白了，如‘A'字符对应的是65

user: user-4
content: 另外alphabet[string[i]]++;应改为alphabet[(unsigned char)string[i]]++;

user: user-4
content: char相当于int8_t,是-128~127的整数类型。

user: user-5
content: char可以被隐式转换为整型，只不过不能超过127

user: user-6
content: 引用 2 楼 paschen 的回复:除非你定义string到int的隐式转换  之前看错了，你string[i]是char类型，其字符的值就是索引号

user: user-7
content: C/C++中 char字符默认可以自动转换为int类型

user: user-8
content: 楼主这样写，我试了下，不能统计string字符数组中各字符的个数。我把alphabet打印出来全是0。

user: user-6
content: 除非你定义string到int的隐式转换

user: user-9
content: 把char这个字符转换成int，实际上市int作为下表。
user-0 提问: 给定x值，求多项式P(x)的值

回复:
user: user-1
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-2
content: 引用 1 楼 yuelengdihai 的回复:Polylist PolyCreate() 这个函数写错 了 1,scanf("%d,%d",&c,&e) 下面那句要去掉 2，aa=Ploycreate();函数明写错了／／与上面不一直 3，struct Polylist *aa;这句改为struct Polynode *aa;

user: user-2
content: Polylist PolyCreate() 这个函数写错 了
user-0 提问: 求大神指教，输入命令行参数的问题

回复:
user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！ 谢啦，已经会了。我现在连一个码农都算不上

user: user-0
content: 引用 5 楼 vanchristin 的回复:main.exe就是你编译生成的可执行文件啊，不一定是main，但是肯定会有一个exe 首先用cd命令切换到exe在的文件夹，然后输入main.exe count one 谢谢，早就已经会了。还有我直接用的文件名，没有.exe，就直接运行了

user: user-1
content: main.exe就是你编译生成的可执行文件啊，不一定是main，但是肯定会有一个exe 首先用cd命令切换到exe在的文件夹，然后输入main.exe count one

user: user-2
content: 现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！

user: user-0
content: 还有我是在windows系统下用的C-FREE

user: user-0
content: 引用 1 楼 qq_29120981 的回复:输入cd /d 你程序的路径(比如main.exe在E盘main文件夹下就输入 cd /d e:\main) 然后输入main count one(count one 就是传进去的参数)  main.exe是什么？我文件夹里找了一下找不到。不会是运行的主程序吧。我是在windows系统下用的C-FREE.

user: user-0
content: main.exe是什么？我文件夹里找了一下找不到。不会是运行的主程序吧。

user: user-3
content: 输入cd /d 你程序的路径(比如main.exe在E盘main文件夹下就输入 cd /d e:\main) 然后输入main count one(count one 就是传进去的参数)
user-0 提问: 哪位大神帮我瞅瞅哪里错了，编译通过可就是结果错误.

回复:
user: user-1
content: 还有建议楼主写代码的时候，对于代码做一定的注释，这样不仅自己看着更为直观，也方便别人看你代码时，对于你所写代码的理解

user: user-1
content: 对于结果出错的问题，首先建议LZ先进行单步调试，看看问题出现在什么地方，是哪里和预期的结构是不一样的

user: user-2
content: 读数据的流程都不对，读取的数据不对，算法估计也不对，凭直觉，算法应该用广搜
user-0 提问: strcspn的用法？ 

回复:
user: user-1
content: http://en.cppreference.com/w/c/string/byte/strcspn

user: user-2
content: 原型：size_t strcspn(const char *s, const char * reject); strcspn()从参数s 字符串的开头计算连续的字符, 而这些字符都完全不在参数reject 所指的字符串中. 简单地说, 若strcspn()返回的数值为n, 则代表字符串s 开头连续有n 个字符都不含字符串reject 内的字符. 楼主给的keys[] = "1234567890";   从起始位置开始一个计数，只要字符串中出现1,2,3,4,5,6,7,8,9,0中的任何一个数字，函数就返回了，返回值是该位置之前字符串的长度（并不是要完全匹配上key才行，只要匹配到key中的任何一个字符就行） 所以返回了4,，打印值是5