Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 指针变量所占内存大小

回复:
user: user-1
content: 64位的系统支持64位和32位的编译器；所以个人觉得跟系统和编译器都有关系。 以下是Windows10 64位+VS2015的调试效果

user: user-2
content: 64位系统可以安装指针为32位编译器（向前兼容），也可以安装指针为64位的编译器； 因此指针占的字节数，跟编译器有直接关系，跟系统也是有关系的。

user: user-3
content: 我觉得该说得更清楚一些。  首先是平台，32位平台只能执行32位程序，64位平台一般能兼容32位和64位程序（Intel曾经有平台激进的只允许64位，但死了）。说跟编译器有关的朋友，忽略了一个事实：如果编译了64位程序，是不能在32位平台上运行的。  接着来说编译器，如果是32位编译器，即编译成32位程序，则指针都是32位，即4字节；如果编译成64位程序，则指针就是64位，即8字节。

user: user-4
content: 编译器一般是32位的  指针占4个字节

user: user-0
content: 引用 6 楼 ananluowei 的回复:编译成32位程序，指针4字节，地址32位 编译成64位程序，指针8字节，地址64位 是看编译器吗？

user: user-0
content: 引用 1 楼 hzy_76 的回复:系统决定的，我们原来都是32位系统，现在基本都是64位了。 意思是64位系统下，变量的地址是64位，指针变量64/8 = 8个字节吗？

user: user-3
content: 系统决定的，我们原来都是32位系统，现在基本都是64位了。

user: user-5
content: 编译成32位程序，指针4字节，地址32位 编译成64位程序，指针8字节，地址64位

user: user-0
content: 引用 4 楼 adusuccessfully 的回复:[quote=引用 2 楼 darker0019527 的回复:] [quote=引用 1 楼 hzy_76 的回复:] 系统决定的，我们原来都是32位系统，现在基本都是64位了。 意思是64位系统下，变量的地址是64位，指针变量64/8 = 8个字节吗？[/quote]  不是，64位系统下，指针变量还占得是4字节。[/quote] 为什么64位系统下还是4B？

user: user-6
content: 引用 2 楼 darker0019527 的回复:[quote=引用 1 楼 hzy_76 的回复:] 系统决定的，我们原来都是32位系统，现在基本都是64位了。 意思是64位系统下，变量的地址是64位，指针变量64/8 = 8个字节吗？[/quote]  不是，64位系统下，指针变量还占得是4字节。

user: user-7
content: 当然是编译器决定的。64位系统就不能编译32位程序了吗？
user-0 提问: 跪求大神看看

回复:
user: user-1
content: 引用 4 楼 weixin_41174083 的回复:[quote=引用 3 楼 das白的回复:]单词拼写错误  switch   swtich 写写，看到了，刚开始没注意  编译器应该有提示吧 你这样写应该编译都过不了吧

user: user-2
content: #include<stdio.h> int main() {     int x;     printf("Please enter a integer between 1 and 7 ");     scanf("%d",&x);     switch(x)     {         case 1:             printf("Today is Monday!\n");             break;         case 2:             printf("Today is Tuesday!\n");             break;         case 3:             printf("Today is Wendy!\n");             break;         case 4:             printf("Today is Tuesday!\n");             break;         case 5:             printf("Today is Friday!\n");             break;         case 6:             printf("Today is weekend!\n");             break;         default:             printf("Today is weekend!\n");     }     return 0; }  switch单词拼写错误；另外，每个case后面缺少break;

user: user-3
content: 类似错误人工走查不太容易看出来， 但编译器有错误提示，应该能够提供一些线索。

user: user-4
content: 单词拼写错误  switch   swtich

user: user-0
content: 这个哪里错了，运行不了，求解。

user: user-5
content: #include<stdio.h> int main() {     int x;     printf("Please enter a integer between 1 and 7 ");    scanf("%d",&x);    switch(x)         {         case 1:                 printf("Today is Monday!\n");break;         case 2:                 printf("Today is Tuesday!\n");break;         case 3:                 printf("Today is Wendy!\n");break;         case 4:                 printf("Today is Tuesday!\n");break;         case 5:                 printf("Today is Friday!\n");break;         case 6:                 printf("Today is weekend!\n");break;         default:                 printf("Today is weekend!\n");break;         }     return 0; }

user: user-0
content: 引用 3 楼 das白的回复:单词拼写错误  switch   swtich 写写，看到了，刚开始没注意
user-0 提问: C语言 U64与U8计算求助

回复:
user: user-1
content: 引用 3 楼 das白的回复:试试这个 图片上不去... 输出格式都为 0x%x

user: user-1
content: 试试这个

user: user-2
content: 你给一个 UINT8 左移 24 位还想得到正确结果……

user: user-3
content: printf("sum:b+a<<24 = 0x%016I64x\n", b+(a<<24)); 改为 printf("sum:b+a<<24 = 0x%016I64x\n", b+(((unsigned int)a)<<24)); 可以吗

user: user-4
content: 主要原因是a 是unsigned char类型，在执行b + (a <<24)时，现将unsigned char 类型转int类型，然后int类型再转u64;这个过程是类型隐式提升 所以在转int类型时，已经是有符号数，再转u64时，就是最高位位符号位，所以是除低24位位0，其他64 - 24位位1； 解决办法可以考虑：  printf("sum:b+a<<24 = 0x%llx\n", b+((unsigned int)a<<24)); 这个办法是去掉u8 转int这个过程，直接跳到u32; 也可以这么解决：  printf("b = %#llx\n", (b << 8)+ a);

user: user-5
content: (a<<24)的结果是一个int，与b相加的时候被扩展到64位（符号扩展）。 像#1那样把a或者a<<24作为无符号数处理就可以了。
user-0 提问: emwin小工具有数量上限 吗？为什么我只要多加一个小工具，程序就跑死了

回复:
user: user-1
content: 兄弟感觉你发错地方了，这边人应该不玩这种板子的吧，我记得原子论坛和秉辉火论坛玩这个的。你到那问问比较好吧。
user-0 提问: c语中百亿之上的数求a+b

回复:
user: user-1
content: 银行系统对大金额的计算用的都是unsigned char数组储存每一位数。

user: user-2
content: 大数据加法；下面是大数乘法的例子，可以在这个基础上修改：  #include <stdio.h> #include <stdlib.h> #include <string.h>  #define MAX_NUM_LEN 2048  int cal_factorial(unsigned char *num_list, int num_size, int n);  int cal_val(unsigned char *num_list, int num_size, int base, int num) {     int i = 0, j;     int len = 1, tmp, carry_bit;      num_list[1] = 1;      while (i < num) {         carry_bit = 0;         for (j = 1; j <= len; j++) {             tmp = num_list[j] * base + carry_bit;             num_list[j] = tmp % 10;             carry_bit = tmp / 10;             if (j >= len && carry_bit != 0)                 len++;             if (num_size-1 < len) {/* overflow */                 printf("Overflow!\n");                 return num_size-1;             }         }         i++;     }      return len; }   int main(void) {     unsigned char num_list[MAX_NUM_LEN];     int num_len, i;     int base, power;      memset(num_list, 0, sizeof(num_list));     printf("Please input two numbers: ");     scanf("%d%d", &base, &power);      if (base < 0 && power % 2)         num_list[0] = 1; /* negative number */     else         num_list[0] = 0;     base = abs(base);      num_len = cal_val(num_list, MAX_NUM_LEN, base, power);     printf("len = %d\n", num_len);     if (num_list[0])         putchar('-');     for (i = num_len; i >= 1; i--)         printf("%d", num_list[i]);     printf("\n");     return 0; }   int cal_factorial(unsigned char *num_list, int num_size, int n) {     int carry_bit, i, j, len = 1;     int tmp;      num_list[1] = 1;     for (i = 2; i <= n; i++)     {         carry_bit = 0;         for (j = 1; j <= len; j++) {             tmp = num_list[j] * i + carry_bit;             num_list[j] = tmp % 10;             carry_bit = tmp / 10;             if (j >= len && carry_bit != 0)                 len++;             if (num_size -1 < len) { /* overflow */                 printf("Overflow!\n");                 return num_size-1;             }         }      }      /*     for (i = len; i >= 1; i--)//逆序输出数组就是结果         printf("%d", a[i]);     printf("\n");     */     return len; }

user: user-3
content: 百度 c语言 大数四则运算

user: user-4
content: 输入的位数很大，肯定是字符串形式输入的12345格式。 最朴素的实现方法：模拟人工计算加法，从个位开始做个位数的加法，同时用一个变量记录进位。循环到最高位即可（字符串短的前面补字符0）。 不是很难的。 关键点在于字符相加 比如 ‘1‘+’2‘，操作是 ’1‘-’0‘+’2‘-’0‘，得出的是数值，判断是否大于10，大于计算进位，减去10，最后+’0‘把数值转换为数字。

user: user-5
content: 不需要自己造轮子 看这篇，从开源代码中取出来的 http://www.cnblogs.com/youyou/archive/2012/05/13/2498317.html
user-0 提问: 大一初学者一个题写错了。。

回复:
user: user-1
content: 这个问题得要求输入集合的个数和集合本身吧？ 没有看到相关的代码啊。

user: user-2
content: 楼上思路没错，可以再加些判断优化一下： 1. 判断A[i] != A[j] 2.最大和不超过X，例如10

user: user-3
content: 我的思路是先用快排排一下，然后嵌套循环两两相加每当和大于最大数就退出循环，比较过程中可以从上次找到的点往后找，应该能快一点

user: user-4
content: int sum=0; int count=0;//记录好数对的个数 int A[10]={1,2,3,4,5,6,7,8,9,10};//给定的集合 for(int i=0;i++;i<10) { for(int j=i+1;j++;j<10) { sum=A[i]+A[j] for(int n=j+1;n++;n<10) { if(sum==A[n]) count++; } } } cout<<"好数对的个数为："<<count<<endl   应该是这样的，我没有运行，思路是这样的，有错你可以改一下。
user-0 提问: 求大神看看哪里不对

回复:
user: user-1
content: #include<stdio.h> #include<string.h>  void exchange(char*p1,char*p2,char*p3); int main() {     char a[32],b[32],c[32],*p1,*p2,*p3;     p1=a;p2=b;p3=c;     printf("原字符串:\n");     scanf("%s%s%s", a, b, c);     exchange(p1,p2,p3);     printf("排序后字符串:%s %s %s\n",a,b,c);     return 0; } char swap(char*p1,char*p2);  void exchange(char*p1,char*p2,char*p3) {     if(strcmp(p1, p2)>0) swap(p1,p2);     if(strcmp(p1,p3)>0) swap(p1,p3);     if(strcmp(p2,p3)>0) swap(p2,p3); } char swap(char *p1, char *p2) {     char t[32];     strcpy(t, p1);     strcpy(p1, p2);     strcpy(p2, t); }  字符串的含义还需要学习一下，基础知识还需要加强呢

user: user-2
content: 感觉楼主指针没有搞清楚，《深入理解C指针》这本书可以参考一下。
user-0 提问: 关于c语言变量的内存分配问题

回复:
user: user-0
content: 引用 1 楼 athbss 的回复://getstring1(),   getstring2()  一样的意思  //这里我要说的是：p1指针指向的是文字常量区，并不是全局区，并且你返回的是一个函数的局部变量 //p1本身的地址是被弹栈了，但是它所指向的a的地址，还是存在的， //所以返回的是一个存在文字常量区的内容，至于为什么地址相同，是因为指针指向的都是文字常量区的a的地址。  char * func_1() {     char buff[3] = "ac";     return buff; } //func_1()这里使用的是一个数组，是在栈中开辟空间来存放ac和‘\0’的，函数一旦调用结束， //就会释放这个函数的栈区空间，你再返回他的地址，所对应的内容，就会出错。结果是一个未知，可能是正确，也可能是错误的。 十分感谢！明白了

user: user-1
content: //getstring1(),   getstring2()  一样的意思  //这里我要说的是：p1指针指向的是文字常量区，并不是全局区，并且你返回的是一个函数的局部变量 //p1本身的地址是被弹栈了，但是它所指向的a的地址，还是存在的， //所以返回的是一个存在文字常量区的内容，至于为什么地址相同，是因为指针指向的都是文字常量区的a的地址。  char * func_1() {     char buff[3] = "ac";     return buff; } //func_1()这里使用的是一个数组，是在栈中开辟空间来存放ac和‘\0’的，函数一旦调用结束， //就会释放这个函数的栈区空间，你再返回他的地址，所对应的内容，就会出错。结果是一个未知，可能是正确，也可能是错误的。
user-0 提问: 运行崩溃的问题

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

user: user-2
content: if((fp=fopen("pic.h","r")==NULL)),逻辑运算大于赋值晕算，所以你这句话的意思是把bool量给了fp，改成if((fp=fopen("pic.h","r"))==NULL),就好了。  #include <iostream>  unsigned char buffer[153600]; int main(void) { 	unsigned long int i,j; 	unsigned char k; 	FILE *fp,*fp1; 	fp=fopen("pic.h","r"); 	if((fp=fopen("pic.h","r"))==NULL) 	{ 		printf("cannot open file!"); 		exit(0); 	} 	if((fp1=fopen("picture.bin","wb"))==NULL) 	{ 		printf("cannot open file!"); 		exit(0); 	} 	fscanf(fp,"%d,",&k);                                        //运行到这就死了 	printf("ok"); 	fscanf(fp,"%c,",&buffer[0]); 	printf("\nok1"); 	for(i=0;i<5400;i++) 	{ 		for(j=0;j<15;j++) 		{ 			fscanf(fp,"%c,",&buffer[i*16+j]); 			printf("%c",buffer[i*16+j]); 		} 		fscanf(fp,"%c,\n",&buffer[i*16+15]); 		printf("%c\n",buffer[i*16+15]); 	}  	fclose(fp);  	fwrite(&buffer,86400,1,fp1); 	fclose(fp1); }

user: user-3
content: if((fp=fopen("pic.h","r")==NULL)) 改成 if((fp=fopen("pic.h","r"))==NULL) 后面一个也是

user: user-0
content: %c也不对，照样崩溃

user: user-3
content: k 对应的应该是 %c
user-0 提问: 新手初学，if else问题求教...

回复:
user: user-1
content: if else if 后面的的if只有当前面的if不满足才执行

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

user: user-3
content: 你怎么知道没有执行呢？最后不是有 Height=Height; 吗？估计这一句执行了，但是没什么变化啊。你输入的时候不用空格隔开输入项试试

user: user-0
content: 就是只执行判断sex的那组if-else 后面的if-else if-else if-else不执行，不知道为啥。。。

user: user-0
content: 是f9和f5吗？我的是阉割版，设断点就停止运行...emmm不想重新下载了，不过还是谢谢。

user: user-4
content: 自己设置几个断点调试一下
user-0 提问: 求解一个关于鞍点的题，非常感谢

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <time.h>  #define ROW 4 #define COL 5   void init_array(int (*array)[COL], int row, int col) {     int i, j;      srand(time(NULL));     for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             array[i][j] = rand() % 100; }   void show_array(int (*array)[COL], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%2d ", array[i][j]);         putchar(10);     } }  void check_saddle_point(int (*point)[2], int (*array)[COL], int row, int col) {     int i, j, k, cnt = 0;     int row_idx, col_idx;     int max_row, min_col;      for (i = 0; i < row; i++) {         max_row = array[i][0];         col_idx = 0;         /* find max value in row */         for (j = 1; j < COL; j++)             if (max_row < array[i][j]) {                 max_row = array[i][j];                 col_idx = j;             }          /* Find min value in col */         min_col = array[i][col_idx];         row_idx = i;         for (k = 0; k < row; k++)             if (min_col > array[k][col_idx]) {                 min_col = array[k][col_idx];                 row_idx = k;             }         /* Check the condition*/         if (row_idx == i && min_col == max_row) {             point[cnt][0] = row_idx;             point[cnt][1] = col_idx;             cnt++;         }      } }  void init_point_array(int (*point)[2], int row) {     int i, j;      for (i = 0; i < row; i++)         for (j = 0; j < 2; j++)             point[i][j] = -1; }  void show_saddle_point(int (*point)[2], int (*array)[COL], int row) {     int i, row_idx, col_idx;      for (i = 0; i < row; i++) {         row_idx = point[i][0];         col_idx = point[i][1];         if (row_idx >= 0 && col_idx >= 0)             printf("鞍点为array[%d][%d] = %d\n", row_idx, col_idx, array[row_idx][col_idx]);     } }  int main(void) {     int array[ROW][COL];     int point[ROW][2];      init_array(array, ROW, COL);     init_point_array(point, ROW);     show_array(array, ROW, COL);     check_saddle_point(point, array, ROW, COL);     show_saddle_point(point, array, ROW);      return 0; } 求鞍点，参考一下吧； 可以在这个基础改一下，鞍点的检查已经有了。

user: user-0
content: 这样总是会多出一行输出结果，不知道是什么原因，求指教，谢谢

user: user-0

user: user-0
content: 改了N次还是会多输出一个No

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

回复:
user: user-1
content: 引用 6 楼 郁闷星期三的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 首先需要了解的是a和&a的区别； a是数组名，也是数组的首地址，类型是int *； &a是数组的地址，这个地址值和a的地址值是一样的，因为都指向同一个地址；但&a的类型是int (*)[5];即&a是5个元素为单位的地址； 所以a+1是向后偏移一个int类型长度的地址，即元素2的地址； &a+1是向后偏移5 * sizeof(int)长度。 了解这些就基本上能理解输出的结果了。  p-1是向后偏移一个sizeof(int)个字节，因为p的类型是int *  你看我打印(int *)(&a +1) 的地址是 0x0018ff35 这个这个地址明显不是5*sizeof(int)的[/quote] 在我这不会，它的值应该是要和p是一样的

user: user-1
content: 输出是2和5，数组名a退化为指针后是int*类型，+1移动1个int距离，&a是int(*)[5]类型，+1移动的是一个数组的大小

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:首先需要了解的是a和&a的区别； a是数组名，也是数组的首地址，类型是int *； &a是数组的地址，这个地址值和a的地址值是一样的，因为都指向同一个地址；但&a的类型是int (*)[5];即&a是5个元素为单位的地址； 所以a+1是向后偏移一个int类型长度的地址，即元素2的地址； &a+1是向后偏移5 * sizeof(int)长度。 了解这些就基本上能理解输出的结果了。  p-1是向后偏移一个sizeof(int)个字节，因为p的类型是int *  你看我打印(int *)(&a +1) 的地址是 0x0018ff35 这个这个地址明显不是5*sizeof(int)的

user: user-2
content: *(a+1)=a[0+1]; *(p-1)=*((int *)(&a +1)-1)=(a数组的地址后加一个int地址再减掉一个int地址最后指向a[4]) =a[4];

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:首先需要了解的是a和&a的区别； a是数组名，也是数组的首地址，类型是int *； &a是数组的地址，这个地址值和a的地址值是一样的，因为都指向同一个地址；但&a的类型是int (*)[5];即&a是5个元素为单位的地址； 所以a+1是向后偏移一个int类型长度的地址，即元素2的地址； &a+1是向后偏移5 * sizeof(int)长度。 了解这些就基本上能理解输出的结果了。  p-1是向后偏移一个sizeof(int)个字节，因为p的类型是int * 谢谢谢谢！

user: user-3
content: 这种题目锻炼C语言的细节理解，虽然实际项目中不推荐这么写。

user: user-4
content: 首先需要了解的是a和&a的区别； a是数组名，也是数组的首地址，类型是int *； &a是数组的地址，这个地址值和a的地址值是一样的，因为都指向同一个地址；但&a的类型是int (*)[5];即&a是5个元素为单位的地址； 所以a+1是向后偏移一个int类型长度的地址，即元素2的地址； &a+1是向后偏移5 * sizeof(int)长度。 了解这些就基本上能理解输出的结果了。  p-1是向后偏移一个sizeof(int)个字节，因为p的类型是int *

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

回复:
user: user-1
content: 引用 3 楼 paschen 的回复:a + b == c 改成 a + b - c < 0.0001   同理其他，否则可能因存储精度问题导致判断为不相等 需要加上绝对值即fabs(a+b-c) < 1e-6;

user: user-2
content: 比较两个浮点数是否相等，可以用两个数差值的绝对值小于等于某个精度值，比如 abs(x-y)<=1e-6 类似这样。

user: user-3
content: a + b == c 改成 a + b - c < 0.0001   同理其他，否则可能因存储精度问题导致判断为不相等

user: user-0
content: 去掉一个=就有error了。。。。。

user: user-4
content: float精度有限 建议不要用==判断两个数是否相等 而是两数相减小于0.001或者其它 就判断其相等
user-0 提问: C语言 求问每一项指针指向哪？//后为输出的值

回复:
user: user-1
content: 把 iArray数组想象成5个连续的方块，指针p就像方块的标签，原来p指向第0个方块，++p，指向的就是第一个方块，（p+2）就指向的第3个方块。 注意方块是从0开始数。

user: user-2
content: 建议自己测试一下，想了解指针的指向情况，建议%p打印出地址出来；分析需要一些时间，但是如果通过自己的动手分析到原因，这样的结果自己能学到更多。

user: user-3
content: 闲的没事干，给你说一下吧。 int main() { 	int iArray[] = { 1,2,3,4,5 }; 	int *p = NULL;  	p = iArray; 	printf("%d", p[0]);//1       指向第一个元素，没问题吧 	printf("%d", *(++p));//2     P指向第二个 	printf("%d", *(p + 2));//4   指针P依然指向第二个，没有变化 	printf("%d", *(p--));//2     P在这一句之后指向第一个元素，也就是1 	printf("%d", *p++);//1       p指向没有变化，第一个元素在此句后加一 	printf("%d", *p);//2         P指向第一个，现在iArray[0]=2 	printf("%d", ++(*p));//3     指向第二个 	printf("%d", *p);//3         指向第二个 	system("pause"); 	return 0; }  自己还是多想想，推荐看《C和指针》

user: user-4
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495 http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-0
content: 就是不是很清楚

user: user-5
content: 只有自加自减会改变p的值 分清前++ 和 后++的区别即可
user-0 提问: 求大佬解疑，怎么解决这个问题呢

回复:
user: user-1
content: 你可以新建一个项目，把代码放到项目里的源文件，然后就可以编译了。不过好像再编译一次又会这样。或者你也可以关掉dev再开。

user: user-2
content: 在D盘建一个目录来保存源代码项目。

user: user-3
content: 换个路径?     以管理员身份运行试试 关闭杀毒软件 重启电脑 重装软件 换个编译器
user-0 提问: 算法的时间复杂度与CPU速度 

回复:
user: user-1
content: 引用 3 楼 m0_37605715 的回复:引用 1 楼 iloveyou418 的回复:因为原来要1000秒的程序现在只需要10s就是后者的100倍原来要1000秒误会写成1000000秒的程序-cpu提升100倍就是10*10=100s原来需要1000秒现在需要100s不就是10倍喽接着还有还有一段话“也就是说，一台老式CPU计算机运行O（n）的程序，和一台速度提高一百倍新式CPU运行O（n^2）的程序，最终胜利方却是老式CPU的计算机。”照你的推论，这段话肯定不成立！！！查阅渐近分析法的大O符号表示，可知：当n趋近于无穷大时     n^2>(n^2)/100>n>n/100 ，n是(n^2)/100的10倍，当且仅当n=10时才成立。这样才解释得通，最后还是谢谢你的回答！  不好意思，之前回答的比较随意，它说的意思实际是：在o(n)下速度提高100倍速对应于o(n*n)下只提高了10倍，而正如你所说，当n越大，o(n)与o(n*n)相差的倍数也就越多，故老式机器运行o(n)肯定获胜

user: user-0
content: 引用 2 楼 paschen 的回复:楼上已经说了，就一个简单的计算 兄弟，谢谢你的回答，不过你可以看看我下面的解释，那个应该才是正确的。

user: user-0
content: 引用 1 楼 iloveyou418 的回复:因为原来要1000秒的程序现在只需要10s就是后者的100倍  原来要1000秒误会写成1000000秒的程序-cpu提升100倍就是10*10=100s 原来需要1000秒现在需要100s不就是10倍喽  接着还有还有一段话“也就是说，一台老式CPU计算机运行O（n）的程序，和一台速度提高一百倍新式CPU运行O（n^2）的程序，最终胜利方却是老式CPU的计算机。” 照你的推论，这段话肯定不成立！！！查阅渐近分析法的大O符号表示，可知：当n趋近于无穷大时     n^2>(n^2)/100>n>n/100 ，n是(n^2)/100的10倍，当且仅当n=10时才成立。这样才解释得通，最后还是谢谢你的回答！

user: user-1
content: 楼上已经说了，就一个简单的计算

user: user-2
content: 因为原来要1000秒的程序现在只需要10s就是后者的100倍  原来要1000秒误会写成1000000秒的程序-cpu提升100倍就是10*10=100s 原来需要1000秒现在需要100s不就是10倍喽
user-0 提问: 编写一个程序，从键盘输入一个长整数m，计算m各位数的和

回复:
user: user-1
content: 万一m是一个10000000000000000000000000位的长——整数呢？

user: user-2
content: while(a=0)   //

user: user-3
content: #include <stdio.h> int main() {     unsigned long a;     int k = 0;      printf("Please input a:");     scanf("%lu", &a);      while (a) {         k = a % 10 + k;         a = a/10;     }      printf("%d\n", k);     return 0; } 参考一下吧

user: user-4
content: 这个论坛大牛真多

user: user-5
content: k未赋予初始值０；

user: user-1
content: 引用 11 楼 binaryhead 的回复:[quote=引用 10 楼 zhao4zhong1 的回复:] 在现实世界中，除时间和空间可能是无限的以外，其它任何事物都是有限的。 没那么绝对吧，圆周率pi就是无限不循环数字[/quote] π是现实世界中的东东吗？现实世界存在无瑕疵的圆或球吗？

user: user-6
content: 引用 10 楼 zhao4zhong1 的回复:在现实世界中，除时间和空间可能是无限的以外，其它任何事物都是有限的。 没那么绝对吧，圆周率pi就是无限不循环数字

user: user-1
content: 在现实世界中，除时间和空间可能是无限的以外，其它任何事物都是有限的。

user: user-7
content: #include <stdio.h>  int main() {   int s = 0; char c;   printf("Please input a number: ");   while (scanf("%c", &c))     if (c > 47 && c < 58) s += c - 48; else       if (c == 10) {printf("%d\n", s); break;} else         {printf("bad input\n"); break;}    return 0; }

user: user-8
content: k=0,如果数字太大的话也要考虑可行性，比如看成字符串会好点

user: user-9
content: [size=16px] 1.因为是要求一个串数字的累和，你必须先将k初始化为0; 2.二楼说的没错，循环条件应该是a!=0;但你这程序有Bug,只能对十位数以内的长整数有效；超过十一位就会出错（我举输入十一个1为例）；运行结果如下;   3.下面是我自己的做法，你可以根据自己定义想要的数组长度来满足自己需求: #include<stdio.h> #include<string.h> char a[1001]; //假定这个数字有1000位 int i,m,sum=0; int main() { scanf("%s",&a); //输入字符串a m=strlen(a); //计算a的长度，并将其赋值给m for(i=0;i<m;i++) sum+=a[i]-48; //对数的每一位进行累加 printf("sum=%d\n",sum); //输出最后累加结果 sum return 0; } 运行结果如下; 你可以自己运行看看，有问题可以一起交流哈！

user: user-10
content: 楼上正解  循环条件 a!=0

user: user-11
content: k没有赋初始值
user-0 提问: 求解关于字符串数组的问题

回复:
user: user-1
content: 你要在结尾加一个‘\0'

user: user-2
content: char a[100],b[100]="0"; b的初始化需要注意，这样初始化只是说明b[0] = ‘0’， b[1] = ‘\0'；

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  int main() {     int i=0,n;     char a[100],b[100]="0";     printf("请输入一串字符：\n");     gets(a);     printf("字符长度为：%d\n",strlen(a));     for(;i<100;i++)         if(a[i]=='\0')         {             n=i;             break;         }     for(i=0;i<n;i++)     {         b[i]=a[n-i-1];     }     // b[n]=a[n];     printf("反向输出的结果是:\n");     //for(i=0;i<100;i++)     for(i=0;i<n;i++)         printf("%c",b[i]);     return 0; } 字符数组输出超过'\0'了，后面的数都是随机值；    //for(i=0;i<100;i++)     for(i=0;i<n;i++) 直接输出有效字符即可；
user-0 提问: 绿化软件，如何对租号玩这个软件今夕绿化

回复:
user: user-0
content: 感谢楼上的大佬，我做出来了

user: user-1
content: 4. 先执行导入注册表操作，然后开启软件，（大部分的软件，注册表导入后就能使用了）

user: user-1
content: 3. 这个命令可以直接导入注册表，ShellExecute(NULL, _T("open"), _T("Regedit.exe"), _T("/s C://Test.reg"), NULL, NULL);

user: user-0
content: 引用 4 楼 lxuyang210 的回复:2. 软件安装后，找到软件路径，复制一下里面的内容，找个新的文件夹下先存着这一步我早就做了

user: user-0
content: 引用 3 楼 lxuyang210 的回复:1. 一般软件绿化，只要在regedit里面找到对应软件的注册表项，然后右键导出嗯嗯，大佬，然后呢

user: user-1
content: 2. 软件安装后，找到软件路径，复制一下里面的内容，找个新的文件夹下先存着

user: user-1
content: 1. 一般软件绿化，只要在regedit里面找到对应软件的注册表项，然后右键导出

user: user-2
content: ISTool 是帮助你创建由 Jordan Russell 制作的 Inno Setup 编译器脚 本的工具。Inno Setup 是一个出色的编译器，即使对于某些专业的安装 制作程序，它唯一的缺点就是它的脚本必须手动编写。  这就是为什么要有 ISTool 的理由。使用该程序，你可以在一个可视化的 环境中编辑 Inno Setup 的脚本，并且创建 Inno Setup 的安装程序脚本 也由此而变得十分简单。  ISTool 支持以下功能: ⑴.支持 Inno Setup 的全部指示 ⑵.拖曳操作。你可以从 Windows 资源管理器中拖曳文件到 ISTool 的文    件区段中 ⑶.使用语法高亮显示脚本 ⑷.大多数区段已完全支持剪贴板的操作 ⑸.保存脚本注释 ⑹.可以导入 Visual Basic .lst 文件与 InstallShield .iwz 文件 ⑺.已经被翻译为多重语言 ============================== 需要2个软件 ISTool调试工具汉化版.exe 安装包制作Innosetup.exe

user: user-0
content: 希望最后的效果是，周末前给需求一个压缩包，解压缩之后就可以使用，或者一个文件夹，复制一下就能用，可以有批处理（解决注册表的问题）
user-0 提问: 求大神带队呦

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

user: user-2
content: VS2015+Windwos10 64位，没看出来有啥子区别

user: user-3
content: 测试过！完全没问题啊·~大佬你说的问题是什么啊？

user: user-4
content: 引用 楼主 qq_41025372 的回复:为什么d=c>0?c:c*(-1);不对，改成d=c>=0?c:c*(-1);就对了？是什么问题，虽然输出的分别是0和-0，但是在计算机中正0与-0没区别啊。。。我在DEV-C++ 5.10中没有出现编译错误，但是在一个网站的提交代码时，却出现错误，当我将>改成>=时，就行了,求解释清楚！！！ 变量c是什么类型，是浮点型吗 原题是什么？发出了看看

user: user-5
content: d=c>0?c:c*(-1); d=c>=0?c:c*(-1);  这两个表达式的区别不是有没有=号那么简单的， 第一个没有等号，那说明若c为0，则c * (-1) 第二个有等号，那说明c为0时，则是c；  最终d要么是0，要么是-0;没什么区别； 还是看你的代码背景吧

user: user-6
content: 对与不对的依据是什么？

user: user-7
content: 语法上都没有问题，你说的对和不对，指的是什么？

user: user-8
content: 没听说有正0 和负0，看你 C   实际是多少吧

user: user-9
content: 网站的锅
user-0 提问: 数据结构和算法的学习时间建议

回复:
user: user-1
content: csdn的一条标语~最没用的是源代码，最有用的是数据结构和算法！

user: user-2
content: 《数据结构（C语言描述）》 《算法精解（C语言描述）》

user: user-3
content: 建议还是继续学C语言，因为基础不牢固直接去学数据结构和算法，那会让你更难受，学不懂； 要想盖高楼，首先需要把地基打牢了。与其求多，不如求精。一步步来，不要着急。学好，用好C语言，没有3~5年学习和运用谈不上精通C语言。

user: user-4
content: 学数据结构吧，这里面其实涉及了算法，常见常用的算法。这个学会了，基本的题你就都能做了。

user: user-5
content: C语言 --》数据结构 --》算法（《算法导论》）             --》自己做程序训练，解决实际问题而不是刷那种简单的考查语法的题                                      - -》练习数据结构（模式匹配，链表，图， 树，二叉树，排序算法）                                                           --研究更高级算法（分治法、贪心法等） ps：本来不是大神，但学习路径基本这样，修行深浅全在个人

user: user-6
content: 大神出来解答吧
user-0 提问: hdoj 巨大数相加 （不知道哪里错了，被wa，求大牛指导）

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */  int main(int argc, char *argv[]) {     char a[1010];     char b[1010];     int  num1[1000];     int  num2[1000];     int  sum[1001];     int  num1_len;     int  num2_len;     int t;     int t1;     int i;     int x;     int y;          scanf("%d",&t);     for(t1=1;t1<=t;t1++)     {         memset(num1,0,sizeof(int)*1001);         memset(num2,0,sizeof(int)*1001);         memset(sum,0,sizeof(int)*1001);         for(i=0;i<1010;i++)         {             a[i]='\0';             b[i]='\0';                                       }                                         //清0          x=0;         scanf("%s %s",a,b);                  num1_len=strlen(a);         num2_len=strlen(b);         for(i=num1_len-1;i>=0;i--)                 {             num1[i]=(int)a[x]-(int)'0';             x++;         }         x=0;         for(i=num2_len-1;i>=0;i--)                    //反序存储          {             num2[i]=(int)b[x]-(int)'0';             x++;         }                  if(num1_len>=num2_len)         {                          for(i=0;i<num1_len;i++)             {                 if(num1[i]+num2[i]+sum[i]>9)                 {                     sum[i]+=num1[i]+num2[i]-10;                     sum[i+1]++;                 }                 else                 {                     sum[i]+=num1[i]+num2[i];                 }             }         }         else         {             for(i=0;i<num2_len;i++)             {                 if(num1[i]+num2[i]+sum[i]>9)                 {                     sum[i]+=num1[i]+num2[i]-10;                     sum[i+1]++;                 }                 else                 {                     sum[i]+=num1[i]+num2[i];                 }             }         }                  printf("Case %d:\n",t1);         printf("%s + %s = ",a,b);         for(i=1000;i>=1;i--)         {             if(sum[1000]==1)             {                 y=1000;                 break;             }                                               if(sum[i]==0 && sum[i-1]!=0)             {                 y=i-1;                 break;             }             if(i-1==0 && sum[i-1]==0 )             {                 printf("%d",0);                 y=-1;                              }                          }                  for(i=y;i>=0;i--)         {             printf("%d",sum[i]);         }         printf("\n");         if(t1!=t)             printf("\n");             }               return 0; }
user-0 提问: gcc编译c程序出错，一个简单的结构体指针定义，各位大神看下是哪里有问题啊

回复:
user: user-1
content: 在结构体内的指针定义前面把struct加上：struct unsigned char *data;

user: user-0
content: 最终也没搞清楚是哪里的问题，把指针的定义移到结构体外面就没报错了

user: user-2
content: 代码没问题，错误内容是什么

user: user-3
content: typedef struct { int version;         int width;          unsigned char *data;  } QRcode; 这儿是不是应该定义下名字呢，直接定义别名，那么别名也应该是谁的名字。  试一下这样是否可行： typedef struct recode { int version;         int width;          unsigned char *data;  } QRcode;
user-0 提问: 一道c语言题目，请问一下各位大神，以下四道程序各自允许结果是什么？为什么？谢谢le

回复:
user: user-0
content: 引用 7 楼 glenshappy 的回复:[quote=引用 1 楼 paschen 的回复:] 依次是4 4 1 0  ~b的值为-4，b&(~b)的值为0  但要注意的是，+的优先级高于&，所以sizeof(t)+b&(~b)是先做+运算，再去做&运算 没大懂啊。。版主，先做+运算，结果为4，然后和-4做与运算，结果为0？不是说输出是4吗？[/quote] 想了一想，突然又懂了

user: user-0
content: 引用 1 楼 paschen 的回复:依次是4 4 1 0  ~b的值为-4，b&(~b)的值为0  但要注意的是，+的优先级高于&，所以sizeof(t)+b&(~b)是先做+运算，再去做&运算 没大懂啊。。版主，先做+运算，结果为4，然后和-4做与运算，结果为0？不是说输出是4吗？

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 1 楼 paschen 的回复:] 依次是4 4 1 0  ~b的值为-4，b&(~b)的值为0  但要注意的是，+的优先级高于&，所以sizeof(t)+b&(~b)是先做+运算，再去做&运算 b是u32的，~b按位取反后，不会是-4，-4是有符号数； ~b按位取反后，是除第一和第二位位0，其他位（2~31位，从0开始）全位1；[/quote] 我试了一下，确实是的，~b的结果是0Xffff fffb十六进制对应的正整数。。

user: user-1
content: 依次是4 4 1 0  ~b的值为-4，b&(~b)的值为0  但要注意的是，+的优先级高于&，所以sizeof(t)+b&(~b)是先做+运算，再去做&运算

user: user-1
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 1 楼 paschen 的回复:] 依次是4 4 1 0  ~b的值为-4，b&(~b)的值为0  但要注意的是，+的优先级高于&，所以sizeof(t)+b&(~b)是先做+运算，再去做&运算 b是u32的，~b按位取反后，不会是-4，-4是有符号数； ~b按位取反后，是除第一和第二位位0，其他位（2~31位，从0开始）全位1；[/quote]  数据在内存中实际是一样的，不必纠结于此，用有符号理解更容易

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: 引用 1 楼 paschen 的回复:依次是4 4 1 0  ~b的值为-4，b&(~b)的值为0  但要注意的是，+的优先级高于&，所以sizeof(t)+b&(~b)是先做+运算，再去做&运算 b是u32的，~b按位取反后，不会是-4，-4是有符号数； ~b按位取反后，是除第一和第二位位0，其他位（2~31位，从0开始）全位1；

user: user-3
content: 建议每个程序都运行一遍，然后根据结果挨个分析。注意运算符的优先级；
user-0 提问: C语言链表操作集.exe 中的 0x00351699 处有未经处理的异常: 0xC0000005: 读取位置 0xcdcdcdcd 时发生访问冲突

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

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

user: user-2
content: #include <stdio.h> #include <stdlib.h>  typedef struct Snode * PtrToNode;  struct Snode   /*去掉typedef，这儿加了没有意义*/ {     PtrToNode next;     int data; };  typedef PtrToNode List;  List CreateList(List L,int n); void printList(List L);  int main() {     List l,L;     int N;     //l=initial();     printf("请输入链表长度");     scanf("%d",&N);     L=CreateList(l,N);     printf("输出链表");     printList(L); }  List CreateList(List L,int n) {     int i;     List p,temp;      //L = (List)malloc(sizeof(PtrToNode));     L = (List)malloc(sizeof(struct Snode));     L->next = NULL;     temp = L;     for(i=0;i<n;i++)     {         p = (List)malloc(sizeof(struct Snode));         scanf("%d",&(p->data));         temp->next=p;         temp=p;     }     return L; } void printList(List L) {     List r;     r=L->next;     while(r)     {         printf("%d ",r->data);         r=r->next;     } } 参考一下吧； 申请空间时，申请的sizeof大小不对； PtrToNode是struct Snode *类型，即是一个指针，应该申请struct Snode才对； 其他问题，详见代码；

user: user-0
content: 哦，想起来了，本来是写了一个初始链表的函数，后来感觉没什么用就删掉了，没删全，那个初始化的函数可以忽略掉

user: user-3
content: // 你确定链表创建是这样 L=(List)malloc(sizeof(PtrToNode)); // 而不是 L=(List)malloc(sizeof( struct Snode ));  其他地方再检查细化吧

user: user-4
content: 有一句l=initial()是什么意思？也没见你申明inital函数呀！
user-0 提问: 一个小问题求指教

回复:
user: user-1
content: 循环退不出来时，中断下来，单步跟踪程序运行，观察程序流程及变量怎么变化，分析原因

user: user-2
content: 代码逻辑不好理解，i, j, k一般都是用于循环变量，这基本上是大家的共识了。如果用于普通变量或者结构体成员，就不很好理解了，代码的可读性就会降低；

user: user-2
content: 引用 5 楼 hdt 的回复:问题多多，那个循环先不说 main函数里调用  CreateSMatrix_OL(&M); 进入到 Status CreateSMatrix_OL(CrossList *M)   /* Create the CrossList M */ {    int m,n,t,i,j,e,k;    OLNode *p,*q;     if(M) free(M);//这里，你把一个指向栈上的指针free掉了 free是对应malloc/realloc/calloc的，除这三个申请的堆上空间，其他方式申请的，不能调用free； 还有问题：  //M->rhead=(OLink*)malloc(sizeof(OLNode)*(m+1));     M->rhead=(OLink*)malloc(sizeof(OLink)*(m+1));     if(!M->rhead)         exit(OVERFLOW);      //M->chead=(OLink*)malloc(sizeof(OLNode)*(n+1));     M->chead=(OLink*)malloc(sizeof(OLink)*(n+1));     if(!M->chead)         exit(OVERFLOW); 申请的空间不对  循环出不去，很可能死循环了，死循环不是在外边的for循环，而应该是内部的循环，内部还有两个循环，建议通过调试打印看一下内部的连个循环那个是死循环；

user: user-3
content: for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }  输入0,0,0退出循环

user: user-0
content: 然后那个循环呢？

user: user-4
content: 问题多多，那个循环先不说 main函数里调用  CreateSMatrix_OL(&M); 进入到 Status CreateSMatrix_OL(CrossList *M)   /* Create the CrossList M */ {    int m,n,t,i,j,e,k;    OLNode *p,*q;     if(M) free(M);//这里，你把一个指向栈上的指针free掉了

user: user-0
content: 用过单步跟踪。就是未发现

user: user-5
content: 表示觉得没什么问题

user: user-0
content: 积分不够很尴尬
user-0 提问: 关于猜数游戏的小程序。分不多，希望大神能指导指导，应该怎样修改。

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <time.h>  int main() {     int a,b;     srand(time(NULL));     a = rand() % 100 + 1;     printf ("请随便输入一个数字，与系统产生的数字进行比较！ :");     scanf ("%d", &b);      while (1) {         if (b > a) {             printf ("您的数字太大啦，请重新输入一个数字！ :");         } else if (b < a) {             printf ("您的数字太小啦，请重新输入一个数字！ :");         } else {             printf ("非常棒，猜对了！ :");             break;         }         scanf ("%d", &b);     }      return 0; }   这个更严谨一些

user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <time.h> main() {     int a,b;     srand(time(NULL));     a = rand() % 100 + 1;     printf ("请随便输入一个数字，与系统产生的数字进行比较！ :");     scanf ("%d", &b);      while (1) {         if (b > a)             printf ("您的数字太大啦，请重新输入一个数字！ :");         else             printf ("您的数字太小啦，请重新输入一个数字！ :");         scanf ("%d", &b);         if (b == a) {             printf ("非常棒，猜对了！ :");             break;         }     } /*      for (;b > a;)     {         printf ("您的数字太大啦，请重新输入一个数字！ :");         scanf ("%d", &b);         if (b <= a)             break ;     }     for (;b<a;)     {         printf ("您的数字太小啦，请重新输入一个数字！ :");         scanf ("%d", &b);         if (b==a)             printf ("非常棒，猜对了！ :");         break;     }     */     return 0; }   参考一下吧 基本的语法错误就有多个，建议基础只是还要多练习一下

user: user-2
content: 注意for的使用格式，两个分号不能省略

user: user-0
content: 原本好像可以运行的诶，为什么还要把那段加进去呢？

user: user-3
content: printf ("请随便输入一个数字，与系统产生的数字进行比较！ :"); scanf ("%d", &b); 这些代码放在一个while(1)循环里面，如果相等了break退出循环。

user: user-4
content: #include <stdio.h> #include <stdlib.h> #include <time.h> main() {     int a,b;     srand(time(NULL));     a = rand() % 100 + 1;     printf ("请随便输入一个数字，与系统产生的数字进行比较！ :");     scanf ("%d", &b);      while (b != a)     {         if (b > a)         {             printf ("您的数字太大啦，请重新输入一个数字！ :");             scanf ("%d", &b);         }         else         {             printf ("您的数字太小啦，请重新输入一个数字！ :");             scanf ("%d", &b);         }     }     printf ("非常棒，猜对了！ :");     return 0; } #include <stdio.h> #include <stdlib.h> #include <time.h> main() {     int a,b;     srand(time(NULL));     a = rand() % 100 + 1;     printf ("请随便输入一个数字，与系统产生的数字进行比较！ :");     scanf ("%d", &b);      while (b != a)     {         if (b > a)         {             printf ("您的数字太大啦，请重新输入一个数字！ :");             scanf ("%d", &b);         }         else         {             printf ("您的数字太小啦，请重新输入一个数字！ :");             scanf ("%d", &b);         }     }     printf ("非常棒，猜对了！ :");     return 0; }

user: user-0
content: 有大神教教小白么。。。
user-0 提问: 希望大神指导一下

回复:
user: user-1
content: for (i=2;i <= sqrt(num); i++) 循环里发现能整除说明不是质数， 然而不能整除并不能说明是质数，因为循环还没有结束 只有循环结束了，所有小于平方根的数都判断过了才能知道是不是质数

user: user-2
content: #include <stdio.h> #include <math.h> main() {     int num,i;     printf ("请输入一个整数！:");     scanf ("%d", &num);     if (num <= 1)     {         printf("这个不是素数！:");     }     for (i=2; i <= sqrt(num); i++)     {         if ((num % i) == 0)         {             printf ("这个不是素数！ :");             break;         }     }     if (i > sqrt(num))         printf ("这个是素数！ :");      return 0; }

user: user-0
content: 有大神指导一下么？帮我修改一下啦，真心不会啊啊，
user-0 提问: 输入一个字符。用指针表示法删除字符串中与该字符相同的字符。用函数实现。。

回复:
user: user-1
content: char *de_char(char* src, char ch) {     char *ret = src;     char *dst = src;     while (*src) {         if (*src != ch)             *dst++ = *src;         src++;     }     *dst = '\0';      return ret; }

user: user-2
content: void d(char *p, char c2) { 	char	*q; 	int		n; 	for (; *p != '\0'; p++) 	{ 		if (*p == c2) 		{ 			q = p + 1; 			while (*q == c2) 				q++; 			n = q - p; 			q = p; 			for (; *q != '\0'; q++) 				*q = *(q + n); 		} 	} }
user-0 提问: 不是说函数不要返回内部变量吗？

回复:
user: user-1
content: 不要返回局部变量说的是返回局部变量的地址，你这里返回是按值返回，返回后是复制了局部变量的值，之后使用的并不是你函数中的局部变量，所以没有问题

user: user-2
content: 其实不明白这些，因为只知其然，不知其所以然

user: user-3
content: 引用 7 楼 xsklld 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 4 楼 xsklld 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] 这个局部变量是一个指针，这个指针指向的是堆上的空间；堆上的空间生命周期是从malloc开始知道free才会结束；  若返回的是局部的数组，那么就会有问题，因为局部数组是在栈上申请的，它的生命周期是从定义开始，到函数结束；函数结束后就会将其释放； 那也是复制构造函数没有写好的锅，跟返回局部变量没有关系。[/quote] 怎么跟局部变量没关系呢？局部变量可能是一个指针变量，也可能是数组等等；[/quote] 我看错了，我以为他的PriorityQueue是个类。[/quote] 哦，楼主的是C语言，不会涉及到类。

user: user-4
content: 引用 5 楼 cfjtaishan 的回复:[quote=引用 4 楼 xsklld 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] 这个局部变量是一个指针，这个指针指向的是堆上的空间；堆上的空间生命周期是从malloc开始知道free才会结束；  若返回的是局部的数组，那么就会有问题，因为局部数组是在栈上申请的，它的生命周期是从定义开始，到函数结束；函数结束后就会将其释放； 那也是复制构造函数没有写好的锅，跟返回局部变量没有关系。[/quote] 怎么跟局部变量没关系呢？局部变量可能是一个指针变量，也可能是数组等等；[/quote] 我看错了，我以为他的PriorityQueue是个类。

user: user-5
content: 返回变量的值没什么问题，本来就是复制的。比如函数内部的x=3，返回这个x没问题 不要返回内部变量指的是不能返回内部变量的地址（即指针）。

user: user-3
content: 引用 4 楼 xsklld 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] 这个局部变量是一个指针，这个指针指向的是堆上的空间；堆上的空间生命周期是从malloc开始知道free才会结束；  若返回的是局部的数组，那么就会有问题，因为局部数组是在栈上申请的，它的生命周期是从定义开始，到函数结束；函数结束后就会将其释放； 那也是复制构造函数没有写好的锅，跟返回局部变量没有关系。[/quote] 怎么跟局部变量没关系呢？局部变量可能是一个指针变量，也可能是数组等等；

user: user-4
content: 引用 3 楼 cfjtaishan 的回复:这个局部变量是一个指针，这个指针指向的是堆上的空间；堆上的空间生命周期是从malloc开始知道free才会结束；  若返回的是局部的数组，那么就会有问题，因为局部数组是在栈上申请的，它的生命周期是从定义开始，到函数结束；函数结束后就会将其释放； 那也是复制构造函数没有写好的锅，跟返回局部变量没有关系。

user: user-3
content: 这个局部变量是一个指针，这个指针指向的是堆上的空间；堆上的空间生命周期是从malloc开始知道free才会结束；  若返回的是局部的数组，那么就会有问题，因为局部数组是在栈上申请的，它的生命周期是从定义开始，到函数结束；函数结束后就会将其释放；

user: user-2
content: 而且，不是不能够返回函数内部的变量，而是不能返回内部变量的引用

user: user-2
content: 它返回的是指针
user-0 提问: Program received signal SIGSEGV, Segmentation fault.错误

回复:
user: user-1
content: 来晚了，也学到了东西。 楼主如果太大的数组就动态分配吧

user: user-0
content: 非常感谢您！！！！您实在是太厉害了！头文件忘记粘出来了。。。程序需要读入一个比较大的数组，所以需要建立一个大数组。

user: user-2
content: 问题的关键可能在input_loc，你提供的代码中看不出它的大小。你先是执行strcpy把它复制到了docu_loc1，这时候docu_loc1用掉了多少字节很重要，因为后面strcat又给连接上IA_out了，这里一不小心就造成溢出。

user: user-3
content: 代码不全呢， non_num太大，作为JA和AA的数组长度，那么可能会超出栈的大小，即越界；可能导致段错误；  栈上的空间是有限的，大的数组不建议在栈上申请，如果需要创建这么大的数组，建议在堆上（malloc/free)或数组端（全局的）； strcpy(docu_loc1,input_loc); input_loc未定义；  程序虽然简单，但是你定义的数组太大，如果不是必须的，不建议定义这么大的数组，尤其是在函数里定义局部变量
user-0 提问: 新手学习：请问我输入一个数组，然后从到大排序输出，为什么不出结果呢？

回复:
user: user-1
content: #include <stdio.h>  int main() {     int a[10] = { 0 };     int i, j, t;      printf("Please enter the array:\n");     for (i = 0; i < 10; i++)         scanf_s("%d", &a[i]);     printf("The sorted array:\n");     for(i=0;i<10;i++)         printf("%d ",a[i]);     for (i = 0; i < 9; i++)     {         for (j = i + 1; j <10; j++)             if (a[i] > a[j])             {                 t = a[i];                 a[i] = a[j];                 a[j] = t;             }     }     printf("The order is:\n");     for (i = 0; i <= 9; i++)         printf("%2d ", a[i]);     printf("\n");     getchar(); } 需要连续输入10个整数，以空格分开； 建议看一下输入的数是否够10个。

user: user-0
content: 把getchar()去掉了，直接ctrl+f5调试就好了。谢谢各位！

user: user-2
content: 二楼大神代码可以打印出来,你是不是要加system("pause");

user: user-0
content: 逐过程调试都可以通过，且输入、赋值、排序都没问题，但最终结果就是不能打印出来。

user: user-0
content: 好像不对哦！

user: user-3
content: 错误在第7行，输入函数书写错误，去掉取地址符。
user-0 提问: c文件i/o 不知道写的这段程序哪里有问题，写到记事本上都是乱码

回复:
user: user-1
content: 引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] 只有int类型的ch才能与EOF匹配。因为EOF是int类型的。 根本原因其实是 EOF被宏定义为-1 char的范围通常是-128..127 int的范围通常是-32768..32767或-2147483648..2147483647 如果读到字符'\xff'，使用char，会被误认为是-1即EOF；使用int，因为是255而不会被误认为是-1即EOF。[/quote] 对，是啊，就是这样呢；

user: user-2
content: 引用 4 楼 cfjtaishan 的回复:只有int类型的ch才能与EOF匹配。因为EOF是int类型的。 根本原因其实是 EOF被宏定义为-1 char的范围通常是-128..127 int的范围通常是-32768..32767或-2147483648..2147483647 如果读到字符'\xff'，使用char，会被误认为是-1即EOF；使用int，因为是255而不会被误认为是-1即EOF。

user: user-1
content: 只有int类型的ch才能与EOF匹配。因为EOF是int类型的。

user: user-1
content: 改一下两个地方， 第一个地方： while((ch=getc(fp))!=EOF) 根据优先级，=的优先级低于!=判断的优先级；所以getc(fp) != EOF先执行，然后将结果（判断结果，1或0）返给ch，所以写入文件里的都是1（数值）  第二个地方，ch的类型，改成int类型；

user: user-3
content: 如楼上 while((ch=getc(fp))  !=EOF) //这里加个括号

user: user-4
content: void copy(char file1[],char file2[]) { 	FILE *fp,*fp2; 	char ch; 	if((fp=fopen(file1,"r"))==NULL) 	{ 		printf("file1 open failed\n"); 		getchar(); 		exit(0); 	} 	if((fp2=fopen(file2,"w"))==NULL) 	{ 		printf("file2 open failed\n"); 		getchar(); 		exit(0); 	} 	while((ch=getc(fp))  !=EOF) //这里加个括号 	{ 		fputc(ch,fp2); 	} 	fclose(fp); 	fclose(fp2); } //----------- while((ch=getc(fp))  !=EOF) //这里加个括号
user-0 提问: for循环的条件

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

user: user-0
content: 引用 1楼user-4 的回复:第一个for的最后， *p可能是\n。 看起来p--是跳过这个\n。但是代码还有其他问题。  下次不要贴图片。不方便。好的，下次不贴图了。。。求解还有什么问题

user: user-2
content: 上一个p指向了'\n'，所以在你循环时，不需要输出'\n'，将p--使其指向'\n'的前一个字符；

user: user-3
content: 上一个循环p多加一 所以这个先p-- 让其回来

user: user-4
content: 第一个for的最后， *p可能是\n。 看起来p--是跳过这个\n。但是代码还有其他问题。  下次不要贴图片。不方便。
user-0 提问: VisualCode无法识别ANSI颜色

回复:
user: user-1
content: 搜“ANSI.SYS”

user: user-2
content: windows不支持  #include <stdio.h> #include <windows.h>  int main() {     HANDLE hdl = GetStdHandle(STD_OUTPUT_HANDLE);     SetConsoleTextAttribute(hdl, FOREGROUND_RED | FOREGROUND_INTENSITY);     printf("Hello ");     SetConsoleTextAttribute(hdl, FOREGROUND_GREEN | FOREGROUND_INTENSITY);     printf("world!\n");      getchar(); }
user-0 提问: 新手求助，bin文件转换为数组文件输出

回复:
user: user-1
content: 仅供参考：#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-2
content: 不好意思，可能需要纠正一下，读二进制用fread，即以下这行：  		fscanf(fp, "%c%c%c", &temp_data[0], &temp_data[1], &temp_data[2]);  替换为：  		fread(&temp_data, 3, 1, fp);

user: user-2
content: 只是按思路写了出来，没有测试，仅供参考。你自己调试和完善吧。   #include <stdio.h> #include <stdlib.h>  typedef struct _data_array { 	int a; 	char b; } DATA_ARRAY;  int main(int argc, char **argv) { 	DATA_ARRAY arrays[1024]; 	FILE *fp = NULL; 	char temp_data[3] = { 0 }; 	int i = 0; 	 	fp = fopen("your path", "b"); 	if (fp == NULL) 		return -1; 	 	for (i = 0; i < 1024 && !feof(fp); i ++) 	{ 		fscanf(fp, "%c%c%c", &temp_data[0], &temp_data[1], &temp_data[2]); 		arrays[i].a = temp_data[1] << 8 + temp_data[0]; 		arrays[i].b = temp_data[2]; 	} 	 	return 0; }

user: user-0
content: 有没有大神给些代码啊，要不小弟要被被人叼了

user: user-0
content: #include <stdio.h> #include <fcntl.h> #include <malloc.h> #include <io.h> #include <errno.h> #include<string.h> #include<sys/types.h> #include<unistd.h> #include<stdlib.h> #include <fcntl.h> #include <malloc.h> #include <io.h> #include <errno.h>  #define  DEST_FILE  "1.h" #define  SRC_FILE   "1.bin" 1 int main(void) { 	FILE* fpSrc; 	Int32 fpSrcTmp,fpDest; 	Int32 fpDestStm; 	char *array = "static const S_Config_first[] = \n{"; 	  	if(!(access(DEST_FILE,0)<0)) 	{ 		 		system("1.h -R"); 		remove("1.h"); 	}  	 if((fpSrcTmp = open(SRC_FILE, O_RDONLY | O_BINARY)) == -1) 	{ 	 		puts("1.bin 不存在，按任意键退出"); 		getch(); 		return 0; 	} 	close(fpSrcTmp);  	fpDest = open("1.h", O_RDWR|O_BINARY|O_CREAT); 	if(fpDest==-1) 	{ 	    printf("errno=%d\n",errno); 	     	    puts("创建文件失败1.h,请重新尝试，按任意键退出！"); 	    getch(); 	    return 0; 	}  	fpSrc = fopen(SRC_FILE,"r"); 	while(!feof(fpSrc)) 	{     	} 我写到这里就不会写了

user: user-3
content: 自己先写个小程序去读这个bin文件，然后按你要的格式输出成文本，然后再复制到你的数组那里

user: user-0
content: 引用 1 楼 hzy_76 的回复:按二进制打开文件，然后按一个双字节整数一个char型的方式循环读取至文件结束。可以给些代码吗，我比新手还菜啊

user: user-2
content: 按二进制打开文件，然后按一个双字节整数一个char型的方式循环读取至文件结束。
user-0 提问: 用指针实现两个字符串连接

回复:
user: user-1
content: 引用 9 楼 qq_41093250 的回复:[quote=引用 8 楼 cfjtaishan 的回复:] #include<stdio.h> #include<string.h> int main() {     char a[32]="dsad";     char *b="dsdffff";     char *p = a;     while(*p++)         ;     p--;   /*后退一个字符，指向a的'\0'*/     while(*p++ = *b++)         ;     *p = 0;    /* 添加'\0'*/      printf("%s\n",a);      return 0; } 三个问题： 1. 字符串常量不能修改，所以*a++= *b++;就会对a修改； 2. 即使a可以修改，那么*a++ = *b++;指针a已经指向了字符串的末尾，直接输出a不能将连接后的字符串输出； 3. 字符串的'\0'没有赋值给a； 你好，为什么不能printf（"%s\n",p）;[/quote] 道理是一样的，因为p指向了字符串的末尾位置。

user: user-0
content: 引用 8 楼 cfjtaishan 的回复:#include<stdio.h> #include<string.h> int main() {     char a[32]="dsad";     char *b="dsdffff";     char *p = a;     while(*p++)         ;     p--;   /*后退一个字符，指向a的'\0'*/     while(*p++ = *b++)         ;     *p = 0;    /* 添加'\0'*/      printf("%s\n",a);      return 0; } 三个问题： 1. 字符串常量不能修改，所以*a++= *b++;就会对a修改； 2. 即使a可以修改，那么*a++ = *b++;指针a已经指向了字符串的末尾，直接输出a不能将连接后的字符串输出； 3. 字符串的'\0'没有赋值给a； 你好，为什么不能printf（"%s\n",p）;

user: user-2
content: 引用 4 楼 qq_41093250 的回复:引用 1 楼 user-5 的回复:你的指针a指向了字面量字符串，那是不可修改的常量，不能拼接能不能详细讲讲指针指向字符串为什么不可修改呢，拜托大神  因为这个指针指向的是常量区的字符串，之所以不需要const char*是历史原因，楼主记住就行

user: user-1
content: #include<stdio.h> #include<string.h> int main() {     char a[32]="dsad";     char *b="dsdffff";     char *p = a;     while(*p++)         ;     p--;   /*后退一个字符，指向a的'\0'*/     while(*p++ = *b++)         ;     *p = 0;    /* 添加'\0'*/      printf("%s\n",a);      return 0; } 三个问题： 1. 字符串常量不能修改，所以*a++= *b++;就会对a修改； 2. 即使a可以修改，那么*a++ = *b++;指针a已经指向了字符串的末尾，直接输出a不能将连接后的字符串输出； 3. 字符串的'\0'没有赋值给a；

user: user-3
content: 百度 字符串常量为什么不能修改 建议 用char数组 字符串变量

user: user-0
content: 引用 3 楼 paschen 的回复:你的指针是指向常量区的字符串，不能修改，否则程序会崩，如果你要修改，用字符数组的形式保存，写成：char a[100]="dsad"; 能不能详细讲讲指针指向字符串为什么不可修改呢

user: user-0
content: 引用 1 楼 user-5 的回复:你的指针a指向了字面量字符串，那是不可修改的常量，不能拼接 能不能详细讲讲指针指向字符串为什么不可修改呢，拜托大神

user: user-2
content: 你的指针是指向常量区的字符串，不能修改，否则程序会崩，如果你要修改，用字符数组的形式保存，写成：char a[100]="dsad";

user: user-4
content: 把改成char 数组、然后用指针指向数组，应该就可以了

user: user-5
content: 你的指针a指向了字面量字符串，那是不可修改的常量，不能拼接
user-0 提问: 哪位大佬帮忙解决一下呀

回复:
user: user-1
content: for (int i=Length ;i>index ;i--)             {                 _dataset [i]=_dataset[i-1];             } 此处有越界； i应该从Length-1开始吧

user: user-2
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？  判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-0
content: 发现了，是插入这里  if (index < 0 || index > Length )                 throw new IndexOutOfRangeException();

user: user-1
content: 引用 5 楼 cfjtaishan 的回复: for (int i=Length ;i>index ;i--)             {                 _dataset [i]=_dataset[i-1];             } 此处有越界； i应该从Length-1开始吧 lst.Insert(3 * i, Console.ReadLine());                                 Console.WriteLine("请输入姓名:");                                 lst.Insert(3 * i + 1, Console.ReadLine());                                 Console.WriteLine("请输入成绩:");                                 lst.Insert(3 * i + 2, Console.ReadLine()); Insert函数中第一个参数可能会导致越界吧， 3 * i + 2等等

user: user-3
content: 数组越界了-

user: user-4
content: for (int i=Length ;i>index ;i--)             {                 _dataset [i]=_dataset[i-1]; 数组是从0开始计数 也就是说最多就是length-1 您尽然从lenght开始访问，焉能不出错？

user: user-5
content: IndexOutOfRangeException不是你抛出的吗……
user-0 提问: 如何显示文件新增的内容[实现简单"tail -f"功能]

回复:
user: user-1
content: 虽然我没有看过 tail 的源代码，但是明显 cfjtaishan 说的是对的。这个需要你自己循环的打开关闭文件，但是需要自己记录一个偏移量，二次打开的话，直接偏移到这个位置，如果后面有新增数据，就从这里开始继续读取。

user: user-2
content: tail的源代码又不是搜不到。

user: user-3
content: 引用 2 楼 Freeforce_CN 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 需要重新打开，因为你在另一个终端里编辑增加的内容，这个终端上打开的文件“感知”不到。 修改文件后 特意用sync 同步过了[/quote] 程序没有重新去读文件的大小呀，所以需要先关闭，然后在打开一次，这样能获取最新的文件大小；

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:需要重新打开，因为你在另一个终端里编辑增加的内容，这个终端上打开的文件“感知”不到。 修改文件后 特意用sync 同步过了

user: user-3
content: 需要重新打开，因为你在另一个终端里编辑增加的内容，这个终端上打开的文件“感知”不到。