Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: c语言文件操作问题

回复:
user: user-0
content: 引用 3 楼 lzhui1987 的回复:如果是一个空文档，fseek没办法第一次就定位到距开头两个long的位置,除非你先写两个long的空格。 如果不是一个空文档，fseek可以定位到距开头两个long的位置，fseek(fp,2*sizeof(long),SEEK_SET) 定位可以。

user: user-1

user: user-0
content: 受教了，谢谢各位~

user: user-2
content: 如果是一个空文档，fseek没办法第一次就定位到距开头两个long的位置,除非你先写两个long的空格。 如果不是一个空文档，fseek可以定位到距开头两个long的位置，fseek(fp,2*sizeof(long),SEEK_SET)

user: user-3
content: 可以，取决于你文件打开模式  打开模式：http://en.cppreference.com/w/c/io/fopen  fseek用法：http://en.cppreference.com/w/c/io/fseek

user: user-4
content: 不可以，只能先写两个long，读的话更不可以了
user-0 提问: 在用c做最长公共子序列的问题时，发现二维数组的参数传参时出现问题

回复:
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-0
content: 已经解决，开始自己打错了，同学帮忙看的，多谢

user: user-2
content: void LCS(int i,int j,char *x,int **b)  改成：  void LCS(int i, int j, char *x, int b[MAXSIZE][MAXSIZE])

user: user-2
content: void LCSLength(int m,int n,char *x,char *y,int **c,int **b)  改成：  void LCSLength(int m, int n, char *x, char *y, int c[MAXSIZE][MAXSIZE], int b[MAXSIZE][MAXSIZE])

user: user-3
content: C类型不安全, 只是抛出警告, C++的话直接错误. 初学者不要看到能够运行就不管警告了  严重性	代码	说明	项目	文件	行	禁止显示状态 警告	C4047	“函数”:“int **”与“int [100][100]”的间接级别不同	Project1	c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c	54	 警告	C4024	“LCSLength”: 形参和实参 5 的类型不同	Project1	c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c	54	 警告	C4024	“LCSLength”: 形参和实参 6 的类型不同	Project1	c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c	54	 警告	C4047	“函数”:“int **”与“int [100][100]”的间接级别不同	Project1	c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c	55	 警告	C4024	“LCS”: 形参和实参 4 的类型不同	Project1	c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c	55

user: user-0
content: 大家可以调试一下，在主函数中的方法总是不对路
user-0 提问: 不知哪里错了，只想练习一下函数调用，不要简化

回复:
user: user-0
content: 可是却显示  sum=4198800  可这不是正确结果啊

user: user-0
content: 谢谢大家的帮助，我一定好好学习c语言，希望有朝一日能像大家一样帮助别人

user: user-1
content: 每个函数都要有定义和声明，函数要定义返回值的类型，你有返回值却没有定义函数的类型。

user: user-2
content: #include <stdio.h> int main() 	 { 	int add(int,int); int a,b,sum; a=10; b=12; sum=add(a,b); printf("sum=%d\n",sum); return 0; } int add(int,int) { int add,a,b; add=a+b; return add; } 注意调用函数的时候  先要定义函数再声明函数

user: user-3
content: 就是找不到函数定义 改成  #include <stdio.h>   int add(int a, int b) {     int add;     add = a + b;     return add; }   int main() {     int a, b, sum;     a = 10;     b = 12;     sum = add(a, b);     printf("sum=%d\n", sum);     return 0; }   或者在前面声明一下  #include <stdio.h> int add(int,int); int main() { int a,b,sum,add; a=10; b=12; sum=add(a,b); printf("sum=%d\n",sum); return 0; } int add(int,int) { int sum,a,b; sum=a+b; return sum; }

user: user-4
content: #include <stdio.h> int add(int,int); int main() { int a,b,sum,add; a=10; b=12; sum=add(a,b); printf("sum=%d\n",sum); return 0; } int add(int,int) { int sum,a,b; sum=a+b; return sum; }

user: user-5
content: 这样改：   #include <stdio.h> int add(int, int); int main() { 	int a, b, sum; 	a = 10; 	b = 12; 	sum = add(a, b); 	printf("sum=%d\n", sum); 	return 0; } int add(int a, int b) { 	int add; 	add = a + b; 	return add; }

user: user-6
content: 复制去用吧 #include<stdio.h> int add(int a ,int b) { int add; add=a+b; return add; } int main() { int a,b,sum; a=10; b=12; sum=add(a,b); printf("sum=%d\n",sum); return 0; }

user: user-7
content: #include <stdio.h>  int add(int a, int b) { 	int add; 	add = a + b; 	return add; }  int main() { 	int a, b, sum; 	a = 10; 	b = 12; 	sum = add(a, b); 	printf("sum=%d\n", sum); 	return 0; }

user: user-8
content: add(int,int)改成 int add(int,int) ，在声明一下函数试试。
user-0 提问: 学C用的是C primer plus，有必要把课后习题全部做一遍吗

回复:
user: user-1
content: 勤能补拙

user: user-2
content: 以后你会发现，课后习题都是属于基础的了，所以能写就写出来，也是锻炼和培养信心。

user: user-3
content: 课后习题  是必须要做的。关键是要理清你的逻辑结构

user: user-0
content: 引用 10 楼 洛恋梦的回复:我卡在指针那了 指针好好理解一下，这本书上的指针并不是那么难哦

user: user-4
content: 我卡在指针那了

user: user-0
content: 引用 8 楼 AlbertS的回复:[quote=引用 4 楼 qq_36029999 的回复:] [quote=引用 1 楼 AlbertS的回复:]现在不一定要做难题，先把基础打牢，难题可以慢慢分解成几个知识点来做 嗯嗯，谢谢，字符串前面的章节课后题一体不落的都给做了，可到了字符串这章就卡了，而且我的情况不是为了学C，导师要求我学unity，他说先让我学C，师兄说学完C，还要学C#,C#是给unity写脚本用的，针对我这种情况，C要学到那种程度就可以去学习C#了呢？[/quote]  如果你是想学C#的话，C作了解就行了，熟悉程序的运行流程就好，不用太深，C#用起来太随意了，你们呢学Unity不用js吗[/quote] 不清楚哎，不过师兄是这么跟我说的，等我学完C我再问下导师吧，不过学Unity必须得学JS吗？

user: user-5
content: 引用 4 楼 qq_36029999 的回复:[quote=引用 1 楼 AlbertS的回复:]现在不一定要做难题，先把基础打牢，难题可以慢慢分解成几个知识点来做 嗯嗯，谢谢，字符串前面的章节课后题一体不落的都给做了，可到了字符串这章就卡了，而且我的情况不是为了学C，导师要求我学unity，他说先让我学C，师兄说学完C，还要学C#,C#是给unity写脚本用的，针对我这种情况，C要学到那种程度就可以去学习C#了呢？[/quote]  如果你是想学C#的话，C作了解就行了，熟悉程序的运行流程就好，不用太深，C#用起来太随意了，你们呢学Unity不用js吗

user: user-6
content: 实在难可以跳过，也不用每一个字都看完，以后有体会了可以回头再来看

user: user-0
content: 引用 2 楼 user-8的回复: 关键是理解，先把概念吃透再写代码，这本书所谓的难题大多数是算法题来的。 嗯嗯，我再把这章节的例题再看一遍后在做这些课后题✊

user: user-0
content: 引用 3 楼 小灸舞的回复:难一点反而便于巩固，不然你觉得你知识都听懂了，然而发现什么都做不了 对呀，虽然难，我还是挺想把他给攻克的，今晚再试试✊

user: user-0
content: 引用 1 楼 AlbertS的回复:现在不一定要做难题，先把基础打牢，难题可以慢慢分解成几个知识点来做 嗯嗯，谢谢，字符串前面的章节课后题一体不落的都给做了，可到了字符串这章就卡了，而且我的情况不是为了学C，导师要求我学unity，他说先让我学C，师兄说学完C，还要学C#,C#是给unity写脚本用的，针对我这种情况，C要学到那种程度就可以去学习C#了呢？

user: user-7
content: 难一点反而便于巩固，不然你觉得你知识都听懂了，然而发现什么都做不了

user: user-8
content: 关键是理解，先把概念吃透再写代码，这本书所谓的难题大多数是算法题来的。

user: user-5
content: 现在不一定要做难题，先把基础打牢，难题可以慢慢分解成几个知识点来做
user-0 提问: 指针问题

回复:
user: user-1
content: 栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

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

user: user-2
content: p改成全局变量或者在堆上分配的变量 int p = 0; snake->sHead = &p; 改成： int *p = new int(0); snake->sHead = p;

user: user-3
content: snake->sHead指向的是rand_snake函数中的p，而这个p是一个局部变量，在这个函数完就销毁了  所以你在move_snake函数中再对其进行输出，结果是未定义的  你可以把p定义为全局变量就没问题

user: user-4
content: int p = 0; 是局部变量
user-0 提问: C程序疑问解答 ——可怕的野指针

回复:
user: user-0
content: 好吧，知道了

user: user-1
content: 你发错地方了，发到你自己的博客吧

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

user: user-3
content: 博客比较合适

user: user-4
content: 建议发表到博客，论坛是提问的
user-0 提问: 新人求教C语言运算问题

回复:
user: user-1
content: 来晚了，楼上都答了

user: user-2
content: 前置++称为前自加，后置的++称为后自加。其计算效果均为操作数自加一。 当单独一个语句的时候没有区别，如果用在表达式中：  i++是先取i的值做计算，再自加； ++i是先自加，再取i的值做计算。  比如 int i = 2, j; 如果 j = i++; 那么先取i的值赋值给j，于是j值为2，i值再自加，i=3。  如果 j = ++i; 那么i先自加，得到i=3，然后再取i值计算，j值为3.

user: user-3
content: 后置的++是先计算x-1的值赋给y，x再进行+1
user-0 提问: strcpy问题，求指点

回复:
user: user-1
content: strcpy是复制字符串，所以它假定字符串会以\0结束，并以此作为循环中止条件。 你这里的数组不是以0结束的，所以实际用strcpy复制的不止10个字节（复制直至遇到第一个以0结尾的字节） 你改成memcpy试试
user-0 提问: 见给的函数 是求A-B链表的算法  但是在实际给一个程序并不能得出A-B

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

user: user-2
content: else分支两个集合元素相等时，两个链表都要往前走吧？

user: user-3
content: 单步跟踪程序运行观察分析原因  或者提供完整的程序

user: user-4
content: 有结构体吗?

user: user-0
content: 我觉得是指针问题 新定义 LNode*p *q, *r 释放后 并没有改变原来的指针 ？ 是这样吗 ？有些不明白还望指教QAQ...
user-0 提问: c

回复:
user: user-1
content: 判断是否为空格：http://en.cppreference.com/w/c/string/byte/isspace  判断是否为字母：http://en.cppreference.com/w/c/string/byte/isalpha  判断是否为数字：http://en.cppreference.com/w/c/string/byte/isdigit  需要包含<ctype.h>头文件

user: user-2
content: #include <stdio.h> #include <ctype.h>  int main() {     int n_space = 0;     int n_alpha = 0;     int n_digit = 0;     int c;          while (1)     {         c = getchar();         if (c == '\n')             break;         if (isspace(c)) n_space++;  //空格类         if (isalpha(c)) n_alpha++;  //字母类         if (isdigit(c)) n_digit++;  //数字类     }     printf("%d,%d,%d\n", n_space, n_alpha, n_digit);          return 0; }
user-0 提问: 这段程序为什么运行出来不是余弦图像？怎么看图

回复:
user: user-1
content: 因为你的控制台一般是80列25行，而你的曲线超过了80列所以自动换行到下一行了引起排版混乱。 如果要绘制函数曲线，需要更改屏幕显示模式的。35x80的显示模式基本不能绘制复杂曲线

user: user-2
content: 1.acos返回的是 0 至 π 之间的计算结果，需要乘10才行 2.而且每打印一行（一次大的for循环），你也需要\n来换行

user: user-3
content: #include<stdio.h> #include<math.h> int main() {     double y;     int x,m;     for(y=1;y>=-1;y-=0.1)     {         m=acos(y)*10;         for(x=1;x<m;x++)printf(" ");         printf("*");         for(;x<62-m;x++)printf(" ");         printf("*\n");     }     getchar();     return 0; }

user: user-0
content: 不管用的，还是这个样子

user: user-0

user: user-4
content: 在main函数最后加上getchar();    #include<stdio.h> #include<math.h> int main() { 	double y; 	int x,m; 	for(y=1;y>=-1;y-=0.1) 	{ 		m=acos(y); 		for(x=1;x<m;x++)printf(" "); 		printf("*"); 		for(;x<62-m;x++)printf(" "); 		printf("*"); 	} 	getchar(); 	return 0; }
user-0 提问: 要对一个链表的一个数删除 结果那个数指向的下个指针变成NULL

回复:
user: user-1
content: 你这一部分：  if(flag) {    delete_list(L_1,flag);    cout<<"存在这个一个数并且已经被删除!"<<endl;    cout<<"现在链表L_1:"<<endl;    print(L_1);   }   你已经删除了，又去print(L_1); ，该函数中使用已经释放了指针，故出错

user: user-0
content: 我自己  发现了 野指针了。。。。。。。

user: user-0
content: 主函数中if中的 delete_list函数存在问题
user-0 提问: 小白求助，关于矩阵的乘法，求大神相助！

回复:
user: user-1
content: r[M][M]初始化

user: user-2
content: r[i][k] += a[i][j] * b[j][i];这句你多了个+号 应该是r[i][k] = a[i][j] * b[j][i];

user: user-3
content: r[i][k]+=a[i][j]*b[j][k];

user: user-4
content: 因为你的r 中不是所有的数都初始化了  你初始的部分只是：  for(k=0;k<M;k++)        for(j=0;j<N;j++)  这里一个唯度上是M，另一个是N  但r的大小两个维度上都是M
user-0 提问: 迭代程序改错

回复:
user: user-1
content: 首先要了解“迭代求根法”背后的原理，不然的话，下次再换个题目：求根号2的迭代算法，又不知道怎么弄了。  这个原理对于“数学系”的学生来说，显而易见，这是一门叫”数值分析，numerical analysis"课程中讲到的root-finding algorithm, 也叫Newton's method

user: user-2
content: while(fabs(x0-x1)<d);{  改成  while(fabs(x0-x1)>=d);{    #include<stdio.h> #include<math.h> int main() { 	double x0,x1,d; 	scanf("%lf",&d); 	x1=0.0; 	do{ 		x0=x1; 		x1=cos(x0); 	} 	while(fabs(x0-x1)>=d);{ 		printf("%.2f\n",x1); 	} 	return 0; }
user-0 提问: 小白求助———计算某年的第几天

回复:
user: user-1
content: if( (year % 4 == 0 )&& (year % 100 !==0)|| (year % 400==0)  leap=1;  括号不对称，!=写成了!==  改成   if( (year % 4 == 0 )&& (year % 100 !=0)|| (year % 400==0) ) leap=1;

user: user-2
content: 1.你弄反了吧,闰年的应该用a数组 2.数组下标从0开始的
user-0 提问: 求救大神，为什么我在创建二叉树的时候if(head!=NULL)不起作用

回复:
user: user-1
content: 要在函数里修改指针的指向，必须传二级指针或者一级指针的引用才行。 传一级指针之所以不行，是因为形参和实参并不是同一个指针（它们只是指向的内存区域相同而已）

user: user-2
content: creatTree函数是按值传递的，这样函数中的参数只是一个复制品，你函数中修改的也只是一个复制品，并没有修改到实际的指针

user: user-3
content: 你创建时改变的是栈上的指针，原指针没有变。

user: user-0
content: #include <stdio.h> #include <stdlib.h>  typedef struct theTree { 	int Data; 	struct theTree* Left; 	struct theTree* Right; }Tree,*PTree;  void visit(int n) { 	printf("%d\n",n); }  void creatTree(PTree &newNode) { 	int inputA; 	 	scanf("%d",&inputA); 	 	if(inputA==-1) 	{ 		newNode=NULL; 		return; 	} 	 	newNode=(Tree*)(malloc(sizeof(Tree))); 	newNode->Data=inputA; 	creatTree(newNode->Left); 	creatTree(newNode->Right); }  void printTree(Tree* head) { 	if(head!=NULL) 	{ 		visit(head->Data); 		printTree(head->Right); 		printTree(head->Left);	 	} } void main() { 	PTree head;  	creatTree(head); 	printf("%d"); 	printTree(head); 	getchar(); 	getchar(); }

user: user-0
content: #include <stdio.h> #include <stdlib.h>  typedef struct theTree { 	int Data; 	struct theTree* Left; 	struct theTree* Right; }Tree,*PTree;  void visit(int n) { 	printf("%d\n",n); }  void creatTree(PTree &newNode) { 	int inputA; 	 	scanf("%d",&inputA); 	 	if(inputA==-1) 	{ 		newNode=NULL; 		return; 	} 	 	newNode=(Tree*)(malloc(sizeof(Tree))); 	newNode->Data=inputA; 	creatTree(newNode->Left); 	creatTree(newNode->Right); }  void printTree(Tree* head) { 	if(head!=NULL) 	{ 		visit(head->Data); 		printTree(head->Right); 		printTree(head->Left);	 	} } void main() { 	PTree head;  	creatTree(head); 	printf("%d"); 	printTree(head); 	getchar(); 	getchar(); }   我把代码改成了这样为啥还是不行啊

user: user-0
content: 要怎么样才能实现地址传递呢？
user-0 提问: 请教C语言的strcpy和C++的strcpy是完全一样的吗？

回复:
user: user-1
content: 即便同样是 C 语言，不同的编译器自带的 C 运行库内部实现也可能是不同的，所以没必要计较这些。标准库的功能就是做到符合标准所规定的功能，内部如何实现是依据厂商和平台的。

user: user-2
content: 理解和讨论之前请先学会如何观察！  在VS IDE中，单步到strcpy处，按Alt+8键，再按几次F11键，你就会来到strcpy对应的c源代码处。

user: user-3
content: 引用 7 楼 winter_1988的回复:请教下，我下面的代码为什么能打印出 "abc" 照理 aa长度是3，那么只能保存ab的吧，最后一个位置应该保存 \0 吧? 而且居然没报错 int main(void) { 	char aa[3]="abc"; 	printf("%s\n",aa); 	return 0; } aa长度是3，应该只保存abc，不保存\0

user: user-4
content: 17.2 The C standard library [library.c] 1 The C++ standard library also makes available the facilities of the C standard library, suitably adjusted to ensure static type safety. 2 The descriptions of many library functions rely on the C standard library for the signatures and semantics of those functions. In all such cases, any use of the restrict qualifier shall be omitted.

user: user-5
content: 只要编译不报错，那么就是可以一致使用的。 C++ 包含重载，所以有 C 语言不支持的参数重载。

user: user-6
content: 区别加重载的和改声明的居多。改参数/功能的几乎没有。  比如: const char* strchr(const char* s, int c); char* strchr( char* s, int c);  long abs(long); // labs() long long abs(long long); // llabs() ldiv_t div(long, long); // ldiv() lldiv_t div(long long, long long); // lldiv()  等等

user: user-6
content: 引用 7 楼 u012483962 的回复:请教下，我下面的代码为什么能打印出 "abc" 照理 aa长度是3，那么只能保存ab的吧，最后一个位置应该保存 \0 吧? 而且居然没报错 int main(void) { 	char aa[3]="abc"; 	printf("%s\n",aa); 	return 0; }  C11 6.7.9 Initialization 14 An array of character type may be initialized by a character string literal or UTF−8 string literal, optionally enclosed in braces. Successive bytes of the string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array. 32 EXAMPLE 8 The declaration char s[] = "abc", t[3] = "abc"; defines ‘‘plain’’ char array objects s and t whose elements are initialized with character string literals. This declaration is identical to char s[] = { 'a', 'b', 'c', '\0' }, t[] = { 'a', 'b', 'c' };  ============================================= 注意，C++ C++14 8.5.2 Character array 2 There shall not be more initializers than there are array elements. [ Example: char cv[4] = "asdf"; // error is ill-formed since there is no space for the implied trailing ’\0’. — end example ]

user: user-0
content: 引用 1 楼 lishunihaoa 的回复:区别是有的，但是不大，因为实现的思路都是一样的。。 谢谢，你说的区别不大，那就是有区别，那真够麻烦的！

user: user-7
content: 从功能上看是一样的，从具体实现可能略有不同，不过你不用关心  C++版的通常在名字空间std下

user: user-8
content: 区别是有的，但是不大，因为实现的思路都是一样的。。

user: user-0
content: 请教下，我下面的代码为什么能打印出 "abc" 照理 aa长度是3，那么只能保存ab的吧，最后一个位置应该保存 \0 吧? 而且居然没报错 int main(void) { 	char aa[3]="abc"; 	printf("%s\n",aa); 	return 0; }

user: user-9
content: 实现思路一致，对于使用者来说完全一样，不需要关心细节，你也可以写一个，并且不同版本可能都会有修改

user: user-0
content: 引用 4 楼 lishunihaoa 的回复:直接用就行啦，有什么麻烦的。 区别在哪里呢？

user: user-8
content: 引用 3 楼 u012483962 的回复:[quote=引用 1 楼 lishunihaoa 的回复:] 区别是有的，但是不大，因为实现的思路都是一样的。。 谢谢，你说的区别不大，那就是有区别，那真够麻烦的！[/quote]  引用 3 楼 u012483962 的回复:[quote=引用 1 楼 lishunihaoa 的回复:] 区别是有的，但是不大，因为实现的思路都是一样的。。 谢谢，你说的区别不大，那就是有区别，那真够麻烦的！[/quote]  直接用就行啦，有什么麻烦的。
user-0 提问: 关于抽象的指针和指针变量

回复:
user: user-1
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

user: user-2
content: 存储空间就好像酒店的房子，一个一个的，而且都有编号地址，现在有一种小纸条，专门用来保存这些门牌号，这小纸条就是指针变量，

user: user-3
content: 变量名可以理解成标识符，标识符是编译原理的概念，编译器自然就继承下来了。 地址这个是编译后的概念， 编译前，代码里都是一些文字（C,C++代码是文本文件） 编译后，每个变量 对应一个地址， 而指针变量的内容，也就是一个地址。

user: user-4
content: 指针存的是地址  并不是所有变量都是指针类型，如int就不是指针  变量存的都是值，只不过指针存的值是其他变量的地址

user: user-5
content: 参考： 《深入理解C指针》

user: user-5
content: 指针就是地址 差不多是对的，不完全对，因为指针还有类型，同一个地址，用int *解析它，还是char *解析它，还是struct Student *解析，是各不相同的。  楼主应该了解内存，比如系统有1M的内存（打个比方），就是1024x1024个字节，你可以想象成100万（多）个格子，每个格子都有编号（从0开始），编号就是地址。比如int i，i变量被分配在编号为第100~103个格子（分配的位置是由系统决定的），如果赋值i=10，那么这4个格子里面存储的就是 00000000 00000000 00000000 00001010（等于整数10），i的地址，就是&i，等于100（编号）。如果有一个int* p，p是一个指针变量，p变量被分配在编号为第104~107个格子，如果赋值p=&i，那么这4个格子里面存储的就是 00000000 00000000 00000000 01100100 （等于整数100），也就是p==100，p变量本身的地址，也就是&p，等于104。  常量，比如const int i=100，是不为i分配空间的，程序编译的时候自动把使用i的地方用100代替。 const char *str="Hello,world", "Hello,world"字符串字面量位于进程内存空间中的文字常量区，比如分配在编号第200~211个格子（每个格子存一个字符，最后有一个'\0'是自动添加的），如果用printf("%p:%s",str,str)输出，结果就是200:Hello,world，200表示str变量指向的地址，str变量可能被分配在108~111个格子（这4个格子里面存的值就等于200），而str变量的地址&str==108。
user-0 提问: if条件的真假是验证表达式的二进制代码是否为零吗

回复:
user: user-0
content: 引用 1 楼 paschen的回复:是的  以上均为假 多谢！

user: user-1
content: 是的  以上均为假

user: user-2
content: 逻辑表达式和逻辑运算的值只有true和false，在C语言里可以用非0和0来表示。
user-0 提问: 【C语言】关于求水仙花数的问题

回复:
user: user-0
content: 感谢3L，已经解决

user: user-1
content: 用int当然达不到要求，楼主应该用char读吧？ char a[4]; scanf("%3s",a);

user: user-2
content: 首先你的scanf的第二个参数就不对，不能这样多数组操作，你可以先输入一个三位数，然后取出每一位的数据存入数组中

user: user-3
content: 应该是你scanf那里的问题。 虽然你定义的是一个数组。但是你输入进去的是int类型的一个数。 建议你把数组类型改一下。改成char再输入。 如果全换就没什么，如果不全换的话就就把输入进去的数转换一下格式再赋给b

user: user-4
content: b[1] 已经越界，b数组就只有一个元素b[0]

user: user-5
content: 你是把输入的整数赋值给了a【0】
user-0 提问: 【c语言】为什么会产生这个错误？？？？

回复:
user: user-1
content: windows的IDE竟然还会出现这种奇葩的错误，表示无语。 像这样简单的C程序，直接用命令行build吧

user: user-2
content: 请创建Win32控制台应用程序，然后再运行试试

user: user-3
content: 文件--新建--项目--Visual C++--Win32控制台应用程序   赞一个

user: user-4
content: 文件--新建--项目--Visual C++--Win32控制台应用程序

user: user-5
content: 工程类型建错了，应该创建WIN32控制台应用程序

user: user-6
content: 你建的是win32的工程？？？写控制台应用程序。。。？我猜是这样
user-0 提问: 字符串处理的这两种写法有什么区别？

回复:
user: user-1
content: 死循环或者是代码复杂度过高，算法不够好，运行的次数太多。

user: user-2
content: 全部转大写或小写，在查找不更好吗

user: user-3
content: 第一种一直会循环，第二种gets执行失败时会不再循环
user-0 提问: 小白求问，关于函数的递归调用，求大神解答

回复:
user: user-0
content: 引用 4 楼 user-1 的回复:[quote=引用 3 楼 AXDii 的回复:] [quote=引用 2 楼 user-1 的回复:] if(a=0)  改成  if(a==0)  else if(a=1)  改成  else if(a==1)   如果你的n是2，那么pow将匹配else中内容，而else后面的while又要求>2，所以什么都没有执行到[/quote] 可以了，谢谢

user: user-1
content: 引用 3 楼 AXDii 的回复:[quote=引用 2 楼 user-1 的回复:] if(a=0)  改成  if(a==0)  else if(a=1)  改成  else if(a==1)   如果你的n是2，那么pow将匹配else中内容，而else后面的while又要求>2，所以什么都没有执行到

user: user-0
content: 引用 2 楼 user-1 的回复:if(a=0)  改成  if(a==0)  else if(a=1)  改成  else if(a==1)   还是不行，n如果大于2的话还是不能输出

user: user-1
content: if(a=0)  改成  if(a==0)  else if(a=1)  改成  else if(a==1)
user-0 提问: ++J的计算问题

回复:
user: user-1
content: 不要再纠结于++i或者i++了 真的 没意义

user: user-2
content: j 在一整个表达式中被改变了三次，这种表达式的行为没有定义(Undefined Behavior)，编译器本来不想让你成功算出一个数来的，但看你这是符合语法的程序，就找了一个有些道理的数 比如16，作为结果了。当然，编译器告诉你它等于0也是合理的，因为编译器本来就不想算这个数。如果编译器在处理这条语句时当场挂掉，也是正当的处理，而且我要称赞这个编译器节操高尚，那时楼主就要问为什么这个语句会导致编译器自尽了.......  同一变量，在相邻序列点之间，只能被改变一次，否则就是 Undefined Behavior.

user: user-0
content: 又写了一遍 发现结果还是16  我用的是codeblocks 然后写的是c语言 ，然后我上传了几张截屏。 （目前还不太了解论坛的发言格式  也不知道我上传的截屏你们能看见不...）

user: user-3
content: 这是未定义行为，涉及顺序点，不同编译器可以有不同实现，不要写这样的代码  关于C,C++表达式求值顺序  http://bbs.csdn.net/topics/370153775

user: user-4
content: 通常的理解应该是4+5+6=15 而楼主得到的结果居然是16，那就只能是4+6+6=16 这取决于编译器生成代码的条件了，这种题不同的编译器可能会得出不同的结果，所以没有太大意义 对于自增操作，你只要弄懂++j和j++的区别就好了，其他的情况不用考虑，正式的项目中没有人会这样写程序

user: user-5
content: 未定义行为 (Undefined behavior)  ========================== 简单的讲，程序是错的，不要对结果有任何期望。

user: user-6
content: 这个是15，等同于4+5+6

user: user-7
content: 你用的是什么编译器,我用Xcode亲测是15啊
user-0 提问: 【c语言求助】关于嵌套循环控制的问题 

回复:
user: user-1
content: 参考：http://blog.csdn.net/tanheaishui/article/details/8069217

user: user-2
content: 你的意思是现在还没发现问题，让大家帮助你找找

user: user-0
content: 谢谢了  已经解决了   感觉有点搞复杂了

user: user-3
content: for循环改成这个试试  	for(a = 0; a < 5; a++) 	{ 		for(b = 0; b < 5-a;b++) 		{ 			printf(" "); 		} 		for(c = 0; c <=a;c++) 		{ 			printf("%c",ch[status+c]); 		} 		for(d = 0; d < a; d++) 		{ 			printf("%c",ch[status+c-d]); 		} 		printf("\n"); 	}
user-0 提问: 为什么我这个程序运行不对。。感觉没有进入循环。。小白。。。

回复:
user: user-1
content: 看书不仔细吧，把这一句  while(scanf("%1f %d",&x,&exp)==2)  改成  while(scanf("%lf %d",&x,&exp)==2)  试试  是"%lf"而不是"%1f"，是字母而不是数字

user: user-2
content: 你把%lf写成了%1f所以导致读入的数字不对
user-0 提问: 本人菜鸟自学中，求下图这道题解题思路。

回复:
user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-2
content: fseek:http://www.cnblogs.com/bamboo-talking/archive/2011/04/06/2006592.html fscanf:http://blog.csdn.net/liangxanhai/article/details/8026496

user: user-3
content: 循环读写文件  http://en.cppreference.com/w/c/io/fseek http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=fscanf

user: user-4
content: 两个for循环是独立的。前者是循环写文件，后者是循环读文件。 fseek()和fscanf()函数可以自行搜索，查看其作用，可以加深自己的印象。
user-0 提问: 一道很初级的c语言的题目 整除打印

回复:
user: user-1
content: 引用 4 楼 paschen 的回复:[quote=引用 3 楼 sinat_25448971的回复:][quote=引用 1 楼 shihengzhen101 的回复:] 你加一个变量计数就行了，记录现在找到的这个符合条件的数是第几个，超过10个就求余，如果是第一个的话输出  printf("%d",i);  如果不是第一个 输出  printf(",%d",i);  那么请问如何控制每10个进行换行呢？谢谢！[/quote] 用你记录次数的t啊...[/quote]  判断是第10个就输出  printf(",%d\n",i);

user: user-0
content: 引用 4 楼 paschen 的回复:[quote=引用 3 楼 sinat_25448971的回复:][quote=引用 1 楼 shihengzhen101 的回复:] 你加一个变量计数就行了，记录现在找到的这个符合条件的数是第几个，超过10个就求余，如果是第一个的话输出  printf("%d",i);  如果不是第一个 输出  printf(",%d",i);  那么请问如何控制每10个进行换行呢？谢谢！[/quote] 用你记录次数的t啊...[/quote] 好的233 谢谢！

user: user-2
content: 引用 3 楼 sinat_25448971的回复:[quote=引用 1 楼 shihengzhen101 的回复:] 你加一个变量计数就行了，记录现在找到的这个符合条件的数是第几个，超过10个就求余，如果是第一个的话输出  printf("%d",i);  如果不是第一个 输出  printf(",%d",i);  那么请问如何控制每10个进行换行呢？谢谢！[/quote] 用你记录次数的t啊...

user: user-0
content: 引用 1 楼 shihengzhen101 的回复:你加一个变量计数就行了，记录现在找到的这个符合条件的数是第几个，超过10个就求余，如果是第一个的话输出  printf("%d",i);  如果不是第一个 输出  printf(",%d",i);  那么请问如何控制每10个进行换行呢？谢谢！

user: user-3
content: "\b"是禁止使用的。

user: user-1
content: 你加一个变量计数就行了，记录现在找到的这个符合条件的数是第几个，超过10个就求余，如果是第一个的话输出  printf("%d",i);  如果不是第一个 输出  printf(",%d",i);
user-0 提问: 关于malloc分配内存的问题

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

user: user-2
content: 楼主想一下，如果只能在malloc中使用常量，那就直接定义一个数组好了，还要malloc这种多余的东西做什么呢。建议楼主多动手敲敲代码就知道了。

user: user-3
content: 引用 5 楼 fefe82 的回复:参考 boost polymorphic_downcast  一个修改版:       template <class Target, class Source>     inline Target polymorphic_downcast(Source* x)     {         if ( dynamic_cast<Target>(x) == x ) {            return static_cast<Target>(x);         } else {            return nullptr;         }     }   回错贴了，版主删了吧 ...

user: user-3
content: 参考 boost polymorphic_downcast  一个修改版:       template <class Target, class Source>     inline Target polymorphic_downcast(Source* x)     {         if ( dynamic_cast<Target>(x) == x ) {            return static_cast<Target>(x);         } else {            return nullptr;         }     }

user: user-4
content: 当然可以有，不然只能写成这种确定大小的malloc(sizeof(int)*2*2) 岂不是显得malloc太弱了，又怎么能叫做动态分配

user: user-5
content: 能分配，动态申请内存是在运行时执行，而不是在编译时执行

user: user-6
content: 当然可以了。

user: user-7
content: 你不会输进去试试吗
user-0 提问:  约瑟夫环程序有点小问题

回复:
user: user-1
content: 你这个申请空间就不对L = (Node*)malloc(sizeof(Linklist)); Linklist是指针类型，sizeof(Linklist)在32位机下恒为4，而它需要的空间显然是大于4的 你也可以单步调试，看看每一步的值是不是都正确，或者在执行完某一步的时候有变量值被修改了（可能是越界） 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 关于指针

回复:
user: user-1
content: void intial(Linklist &L)       是传入指针的引用，也就是按引用传递，不过这个语法不是C的，是C++的  如果void intial(Linklist L)如果这样传递只能改变指针的内容     而void intial(Linklist &L) 这样传递不仅可以改变内容，还可以改变指针的指向  如果不用引用，那只能使用二级指针了

user: user-2
content: void intial(Linklist &L)       是传入指针的引用，也就是按引用传递，不过这个语法不是C的，是C++的  C语言里可以写成void intial(Linklist *L)，然后传入指针的地址，函数中能过*L访问指针
user-0 提问: 关于线程的疑问，求助大神们

回复:
user: user-1
content: 参考Linux源代码中创建线程相关片断。

user: user-2
content: http://blog.csdn.net/gykimo/article/details/9132157

user: user-0
content: 引用 4 楼 eastfriendwu 的回复:个人认为： 主线程： (a)主线程初始化（内核或者系统库添加） (b)main()（用户代码） (c)主线程清理工作，包括kill所有工作线程。 ------------------------------------- 子线程： a)线程初始化 b)thread_func() （用户代码） c)线程清理工作，通过系统调用，内核干掉这个线程，调度其他线程去了，不再返回了。  也就是说，咱们指定的入口函数，只是线程执行的一部分，它还有初始化和清理，退出代码。 有道理，我个人也有种想法：如你所说，这里的thread_func()应该与最初的main()有相似的性质，都由操作系统来调度，都是各自线程的入口函数，那么两者的return就应该也一样，在程序执行完或者return后重新交由操作系统来处理。

user: user-3
content: 个人认为： 主线程： (a)主线程初始化（内核或者系统库添加） (b)main()（用户代码） (c)主线程清理工作，包括kill所有工作线程。 ------------------------------------- 子线程： a)线程初始化 b)thread_func() （用户代码） c)线程清理工作，通过系统调用，内核干掉这个线程，调度其他线程去了，不再返回了。  也就是说，咱们指定的入口函数，只是线程执行的一部分，它还有初始化和清理，退出代码。

user: user-4
content: 每个线程都有自己的栈空间

user: user-0
content: 想知道在创建线程时，CPU会怎么处理。因为线程执行结束时不会返回原地址继续执行，肯定跟函数调用不一样，但又不清楚是什么样

user: user-5
content: 会有几个不同的空间，变量共享，可以在不同的cpu上运行，以加速原来的程序运行速度，也就是并行
user-0 提问: 16进制、10进制、位、字节的相关问题

回复:
user: user-0
content: 我试了一下，不行  为什么lengh[1]和*p的输出都是不一样的

user: user-1
content: datalengh=(int)lengh[1]<<8|(int)lengh[0];   这个靠谱

user: user-2
content: datalengh=(int)lengh[1]<<8|(int)lengh[0];
user-0 提问: fopen出错的原因

回复:
user: user-1
content: 确实，像这种问题，出错后，检查下errno就知道原因了，perror ()  或者 strerror() 打印一下。明显问题是fopen的mode不对， "rb" ---> "ab"

user: user-2
content: 不要凭空想是什么原因，  Return value 1) If successful, returns a pointer to the new file stream. The stream is fully buffered unless filename refers to an interactive device. On error, returns a null pointer. POSIX requires that errno is set in this case.  检查errno的值来判断是什么原因  http://en.cppreference.com/w/c/io/fopen

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

回复:
user: user-1
content: 一  语法上把strcpy(p,"hello world");改成strcpy(src,"hello world");这里应该是笔误吧,否则无法编译. 二 fun函数中你的型参是char*,你传得实参是src的一个副本,因此src不会只想你分配的那100个字节 要这样改: #include <stdio.h> #include <stdlib.h> #include <string.h>   void fun(char** p) {     *p=(char*)malloc(100); }  int main(int argc, char const *argv[]) {     char *src=NULL;     fun(&src);     strcpy(src,"hello world");     printf("%s\n",src );     return 0; }  结果: hyman@hyman-laptop:~/test$ gcc -g test.c hyman@hyman-laptop:~/test$ ./a.out  hello world
user-0 提问: 两个头文件 和一个.c 文件 加在一个.c文件（main2-2）中 出现很多问题

回复:
user: user-0
content: c1.h部分 我输入复制错了 是下面的  /* c1.h (程序名) */  #include<string.h>  #include<ctype.h>  #include<malloc.h> /* malloc()等 */  #include<limits.h> /* INT_MAX等 */  #include<stdio.h> /* EOF(=^Z或F6),NULL */  #include<stdlib.h> /* atoi() */  #include<io.h> /* eof() */  #include<math.h> /* floor(),ceil(),abs() */  #include<process.h> /* exit() */  /* 函数结果状态代码 */  #define TRUE 1  #define FALSE 0  #define OK 1  #define ERROR 0  #define INFEASIBLE -1  /* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */  typedef int Status; /* Status是函数的类型,其值是函数结果状态代码，如OK等 */  typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
user-0 提问: loop和坐标： 各位大神，帮帮忙！小弟感激不尽！！谢谢。

回复:
user: user-1
content: if (sqrt((x-(-2.0))*(x-(-2.0))+(y-1.0)*(y-1.0))<10e-5) break;//A坐标(-2.000000, 1.000000),当（x，y）和A坐标相差距离是10^-5 的时候停止loop
user-0 提问: 关于指针的问题，请大神回答下

回复:
user: user-1
content: 引用 5 楼 qq_36140737的回复:定义一个char p试试多少啊？ 哎，忽略上面的回答吧。 我作为一个新手，只是想表达下个人看法。 首先，c语言里面，你随便拿来一个变量p，然后来找这个p里面的地址指向，是不是哪里出了问题？再者，连p自己都不知道自己是哪里的，它怎么来指定一个地址给你？(p是虚拟) 你把p换成a,b,c也一个道理。 当然，我作为个小白。我认为，你可以想出其它的方法来解决你的疑惑。 至于指针这东西嘛，本来就没有指针。只是拿来用于形象的表达。 楼上的系统提示不错，给个赞。

user: user-1
content: 定义一个char p试试多少啊？

user: user-2
content: 引用 2 楼 qq423399099 的回复:windows里常见的内存填充数据含义 * 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory * 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers * 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory * 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger * 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files * 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory * 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory * 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash * 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory * 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory  其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-3
content: 只要知道这个地址不可用就行了，研究具体值没有意义

user: user-4
content: windows里常见的内存填充数据含义 * 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory * 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers * 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory * 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger * 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files * 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory * 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory * 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash * 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory * 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory

user: user-1
content: *p未被初始化，其存储的值是随机值。在定义指针变量后，系统分配的只是指针本身的.内存(指针)，并没未分配存储数据的内存(指针的值)。就好比，上面说的，定义一个变量，变量单元未定义值前可能有随机值(垃圾值)，在被赋值以后才会记录赋予的值。(我是小白，我找的答案。)

user: user-1
content: int p[5]; 	 	printf("%p  %xd",&p,p); 	printf("\n%p   %xd",&p[1],p[1]);

user: user-1
content: 试试这个，虽然，不知道能不能帮你。

user: user-5
content: 存放之前栈上留下的值  VC在调试时会将未初始的栈内存用0xcc填充，未初始的堆内存用0xcd填充   这些都是无意义的值，就是为了方便你调试的，实际上如果工具不给你初始化，就是一个随机值

user: user-6
content: 存放之前栈上留下的值  VC在调试时会将未初始的栈内存用0xcc填充，未初始的堆内存用0xcd填充
user-0 提问: 求大牛指教

回复:
user: user-1
content: 你判断if(i>=6){  但你的i并不是输入字符串的长度，而是循环后的值（20）  你应该用strlen得到输入的长度   #include<stdio.h> void main(){ 	char c[20]; 	int i; 	int a,b,h,d; 	int len; 	a=0; 	b=0; 	h=0; 	d=0; 	scanf("%s",c); 	len = strlen(c); 	for(i=0;i<len;i++){ 		if((c[i]>'A'&&c[i]<'Z')||c[i]<'0'||(c[i]>'9'&&c[i]<'A')||(c[i]>'Z'&&c[i]<'a')||c[i]>'z') 			a=1; 		if(c[i]>='0'&&c[i]<='9') 			d=1; 		if(c[i]>='A'&&c[i]<='Z') 			b=1; 		if(c[i]>='a'&&c[i]<='z') 			h=1; 		if(c[i]=='\0') 			break; 	} 	if(len>=6){ 		if(a==1&&b==1&&h==1&&d==1) 			printf("very strong"); 		else 			if(a==0&&b==1&&h==1&&d==1) 				printf("strong"); 			else 				if(a==0&&b==0&&h==1&&d==1) 					printf("normal"); 				else 					if(a==0&&b==0&&h==0&&d==1) 						printf("weak"); 	} 	if(len<6) 		printf("wrong"); }
user-0 提问: vc6.0编写2016日历，只用for与while，无报错，无法正常运行。

回复:
user: user-1
content: 要分清函数调用和函数声明

user: user-0
content: #include<stdio.h> #define K 7 void months(int month); int main() { 	int point,p; 	printf("这是2016年的日历，请输入月份：");  	p = scanf("%d",&point); 	while((p+(point<1)+(point>12)) == 1){ 		printf("周一\t周二\t周三\t周四\t周五\t周六\t周日\n"); 		months(point); 		p = scanf("%d",&point); 	}  	return 0; } //---------------------------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------------------- void months(int month) { 	int n; 	// 	int day = 31; 	int x2,x4,x6,x9,x11; 	// 	int kong=4; 	int a,b; 	// 	//表格赋值 	int i,date[42],term; 	for(i=0;i<42;i++) 		date[i]=i+1; 	//ok 	// //以下是 天数 对应各月----------------------------------------------------------------------------------------------- 	for(x9=(month==9),x4=(month==4),x6=(month==6),x11=(month==11),n=x4+x6+x9+x11;n != 0;n=0) 		day = 30; 	for(x2=month;x2==2;x2++) 		day = 29;     //ok     // //以下是 空位数 对应各月,,fuck busy !   ---------------------------------------------------------------------------------- 	for(a=(month==2),b=(month==8);a+b == 1;a++) 		kong=0; 	for(a=(month==9),b=(month==12);a+b == 1;a++) 		kong=3; 	for(a=(month==11),b=(month==3);a+b == 1;a++) 		kong=1; 	for(a=(month==6);a == 1;a++) 		kong=2; 	for(a=(month==10);a == 1;a++) 		kong=5; 	for(a=(month==5);a == 1;a++) 		kong=6; 	//ok 	// //下面打印正二八经的月表格--------------------------------------------------------------------------------------------------- 	for(i=0;i<kong;i++) 		printf("\t"); 	for(i=0,term=K-kong-1;i<day;i++,term--){ 		printf("%d\t",date[i]); 		while(term==0){ 			printf("\n"); 			term=K;} 	} 	printf("\n\n时光荏苒，好好珍惜！\n\n\n\n退出按q"); //okZ // } 谢谢啦！ 终于好了

user: user-2
content: main函数中：  void months(month);  改成  months(month);
user-0 提问: linux下如何用C语言编程判断某端口是否被占用

回复:
user: user-1
content: 引用 4 楼 qq_15311337 的回复:谢谢各位，已解决。 咋解决 的啊？

user: user-2
content: bool srvPortIsUsed(int port) {     std::strstream srm;     srm << "lsof -i :" << port << " >netstat.txt";     system(srm.str());     std::ifstream in("netstat.txt");     std::string line;     std::getline(in,line);     std::getline(in,line);     if(!line.empty())     {         line.find_first_of(' ');         line = line.substr(line.find_first_of(' ')+1);         line = line.substr(0,line.find_first_of(' '));         std::string sr = "kill -9 " + line;         system(sr.c_str());     }   }

user: user-0
content: 谢谢各位，已解决。

user: user-3
content: system("netstat -na >netstat.txt"); //然后读文件netstat.txt的内容

user: user-4
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h>  #define MAXLINE 80  int main(void) { 	struct sockaddr_in servaddr; 	int sockfd,i,serverport,ret; 	sockfd = socket(AF_INET, SOCK_STREAM, 0);  	bzero(&servaddr, sizeof(servaddr)); 	servaddr.sin_family = AF_INET; 	inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);         for(i = 0;i < 65535;i++) 	{            servaddr.sin_port = htons(i); 	   ret = connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));            if(EISCONN == ret)            {                  printf("端口 %d被占用",i);            } 	  else            {                close(sockfd);            }         } 	return 0; }

user: user-5
content: int port = 8888; int fd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(port); inet_pton(AF_INET, "0.0.0.0", &addr.sin_addr); if(bind(fd, (struct sockaddr *)(&addr), sizeof(sockaddr_in)) < 0) {     printf("port %d has been used.\n", port); } close(fd);
user-0 提问: 如何从被调函数结束所有流程，但又使程序不退出

回复:
user: user-1
content: 引用 9 楼 u010165006 的回复:抛出异常，会调整函数调用栈，到捕获它的主调函数。  抛出异常，可以调整函数调用栈，到捕获它的主调函数（的主调函数）继续运行，如果没有在抛出异常的函数内捕获的话。

user: user-1
content: 抛出异常，会调整函数调用栈，到捕获它的主调函数。

user: user-2
content: 引用 5 楼 mmm325400的回复:@huang19950308 那样的意思就是吧被调用函数直接写到函数中吗。既然把他写成了函数肯定是要多次调用，或者多种情况下都要调用。这样会徒增非常多的重复代码 1.3楼说的都挺不错啊

user: user-3
content: 真的很多层的,而且在底层还需要做一些上层的结束的工作,那只能说明你的程序结构有问题.

user: user-4
content: 仅供参考：#include <iostream> using namespace std; struct MyStruct {     int Nodedata;     MyStruct *pLeft;     MyStruct *pRight; } s1,s2,s3,s4,s5,s6,s7,s8; void ashow(MyStruct * p) {     if (p != nullptr) {         ashow(p->pLeft);         ashow(p->pRight);         cout << p->Nodedata << endl;         if (p->Nodedata == 4) {             throw 1;//退出递归.直接返回.         }     } } int main() {     MyStruct *pRoot;//根      pRoot = &s1;     s1.Nodedata = 1;     s2.Nodedata = 2;     s3.Nodedata = 3;     s4.Nodedata = 4;     s5.Nodedata = 5;     s6.Nodedata = 6;     s7.Nodedata = 7;     s8.Nodedata = 8;      s1.pLeft = &s2;     s1.pRight = &s3;      s2.pLeft = &s4;     s2.pRight = &s5;      s3.pLeft = &s6;     s3.pRight = &s7;     try {         ashow(pRoot);     } catch (int err) {         cout<<"catch err "<<err<<endl;     }     return 0; } //4 //catch err 1 //  再供参考：#include <stdio.h> #include <setjmp.h> jmp_buf mark; int i=0; void c() {     printf( "c in\n");     if (1==i%2) longjmp( mark, i );     printf( "c out\n"); } void b() {     printf( "b in\n");     c();     printf( "b out\n"); } void a() {     printf( "a in\n");     b();     printf( "a out\n"); } void main( void ) {    int jmpret;    jmpret = setjmp( mark );    printf( "Start %d\n",jmpret);    if( jmpret == 0 ) {        printf( "First\n");        a();        i++;        a();    } else {        printf( "Second\n");    } } //Start 0 //First //a in //b in //c in //c out //b out //a out //a in //b in //c in //Start 1 //Second //

user: user-0
content: @huang19950308 那样的意思就是吧被调用函数直接写到函数中吗。既然把他写成了函数肯定是要多次调用，或者多种情况下都要调用。这样会徒增非常多的重复代码

user: user-5
content: switch语句再加一个循环语句就可实现

user: user-5
content: 用一个switch语句就可以实现

user: user-0
content: 能写个简单例子吗？

user: user-6
content: 可以抛出一个异常，然后在希望退到的那个函数里捕获这个异常
user-0 提问: 为什么我收到的数据多了那么多FFFFFFFF

回复:
user: user-1
content: #include <stdio.h> #include <string.h> FILE *f; char buffer[4096]; int r,a; void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } } int main(int argc,char **argv) {     if (argc<2) {         fprintf(stderr,"Usage: %s filename.ext\n",argv[0]);         return 2;     }     f=fopen(argv[1],"rb");     if (NULL==f) {         fprintf(stderr,"Can not open file [%s]!\n",argv[1]);         return 1;     }     a=0;     while (1) {         r=fread(buffer,1,4096,f);         HexDump(buffer,r,a);         a+=r;         if (r<4096) break;     }     fclose(f);     return 0; }

user: user-2
content: 我擦嘞，结贴这么快

user: user-2
content: 问题在 %.2x上，点号加2表示打印浮点数，保留小数点后两位，整数部分不限制，这时候来个char数据，如果最高位为1，以浮点数表示，则为负数，就出现了FFFFFFFF的现象

user: user-0
content: 引用 4 楼 user-4 的回复: printf("%02X ", static_cast<unsigned char>(revData[i])); 可以了 谢谢

user: user-3
content: 说明数据的二进制表示都是1，可能是无效数据，或者结束数据

user: user-4
content: printf("%02X ", static_cast<unsigned char>(revData[i]));

user: user-0
content: 引用 1 楼 user-4 的回复:因为revData[xxx]是cha却被按照%x显示(16进制格式化的int), 先转换成unsigned char 我在显示之前强制类型转换成(unsigned char)  revData[255]试了一下，还是和之前一样  很多FFFFFF

user: user-0
content: 我在显示之前强制类型转换成(unsigned char)  revData[255]试了一下，还是和之前一样  很多FFFFFF

user: user-4
content: 因为revData[xxx]是cha却被按照%x显示(16进制格式化的int), 先转换成unsigned char
user-0 提问: 分享点资源（代码、技术点）

回复:
user: user-0
content: .......

user: user-1
content: 论坛分和下载分可以互换。

user: user-2

user: user-3
content: 赞一下

user: user-0
content: 这个printf结果?，自己顶顶 void test_1() { char idx; u32 n = 0x03020100; char w[8] = "abcdefg";  idx = n; w[++idx] = idx + '0'; w[++idx] = --idx - 1;  printf("%d\n", idx); printf("%c\n", w[idx]); printf("%s\n", w + idx); }

user: user-4

user: user-0
content: 还有个人机对战的五子棋，喜欢的可以看看 http://download.csdn.net/detail/qixing1115/3569086
user-0 提问: 中缀表达式转化为后缀表达式

回复:
user: user-1
content: 引用 3 楼 xinye1230 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];  这是什么啊？？[/quote] 你错误地使用了scanf("%c",&c);

user: user-1
content: 天下难事必做于易,天下大事必做于细。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:[quote=引用 3 楼 xinye1230 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];  这是什么啊？？[/quote] 你错误地使用了scanf("%c",&c);[/quote] 嗯，好的，谢谢，你提醒的对，我找到错误了。我把出栈时返回的值写错了，应该是*e=*--（s->top）而我写成了*--（s->base）.

user: user-0
content: 引用 2 楼 user-2 的回复:Push函数中，如果relloc后，s->top可能已经失效，s->stacksize也会发生变化 我没有看懂你说的，什么意思啊？

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:在每个最后不带\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: Push函数中，如果relloc后，s->top可能已经失效，s->stacksize也会发生变化

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-0 提问: 我想问一个小问题

回复:
user: user-1
content: 楼主学C语言不看书吗？

user: user-2
content: 后面是C库函数，用于输出

user: user-2
content: 前三个是用于定义一个变量的数据类型，分别对应整型，浮点型，字符型

user: user-3
content: 前3个是一种数据类型的关键字，分别表示整型、浮点型、字符类型 第4个是一个库函数，用于输出   同意同意

user: user-4
content: 前3个是一种数据类型的关键字，分别表示整型、浮点型、字符类型 第4个是一个库函数，用于输出

user: user-5
content: c语言中int,fioat,char,printf分别表示什么。 int,fioat,char分别是数据类型,分别是整型，浮点型，字符型（但其实也是个数值，不过这个数值可以以多种方式显示，比如16进制数值0x41，10进制数值65，纯字符'A'） printf是库函数，需要包含头文件<cstdio>

user: user-6
content: int,fioat,char表示三种基本的数据类型。 int是整型数据;如:int a  则a的值只能是整型;如a=3; float是浮点型数据;如:float a   则a的值只能是浮点型数据;如a=3.50; char是字符型;如:char a  则a的值只能是字符型;如a='a'  printf是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。

user: user-7
content: 前3个是数据类型 最后一个是函数名称
user-0 提问: C语言基础

回复:
user: user-1
content: 引用 4 楼 paschen 的回复:没有 34% 这种用法  %只有取余的意思  用于字符串可以作为printf  scanf 的参数类型指定 除非后缀表达式

user: user-2
content: 没有 34% 这种用法  %只有取余的意思  用于字符串可以作为printf  scanf 的参数类型指定

user: user-3
content: 34%不对，应该写3%4，%取余，然后就是scanf 和printf中，

user: user-4
content: 1.模运算，即求余数。 表达式 a % b 就是计算 a 除以 b 得出的余数。 例如: 4 % 3 的结果是 1 2.转义符，比如在scanf()和printf()中的输入参数常出现带有%的表示参数类型的变量，如%d,%f等。

user: user-5
content: %除了取余还有输入输出时的格式说明符的作用，如：scanf("%d,a)这个%就是格式说明符，%d就是以十进制的格式输 34%应该是不对的吧，一般都是a%b这种格式取余吧

user: user-6
content: 好像没有这种写法
user-0 提问: fopen(3),fopen(3p)的区别是什么

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

user: user-1
content: 第二个是C99标准之前，第一个是从C99开始  看你使用的是哪个标准  http://en.cppreference.com/w/c/io/fopen

user: user-2
content: 3指man section 3 3p指man section 3 posix  两个fopen的差异如一楼所说，restrict是C99的新关键字，可以指导编译器做优化。 如果不理解这个关键字，你可以认为它不存在，两个fopen就是一样的，不影响逻辑使用。

user: user-3
content: FILE *fopen( const char *filename, const char *mode );(until C99) FILE *fopen( const char *restrict filename, const char *restrict mode );(since C99)
user-0 提问: 怎么查看C语言的一个头文件里都有什么函数

回复:
user: user-1
content: 引用 2 楼 qq423399099 的回复:直接右键打开文档？ 双击打开文档应该也行。

user: user-2
content: 在VS安装目录，比如我的： F:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include 目录里直接用记事本打开stdio.h 不过头文件不好看

user: user-3
content: 直接右键打开文档？

user: user-4
content: 1）选中这个文件引用Alt+G跳转到文件查看 2）MSDN查看 3）一些C语言网站查看

user: user-5
content: 可以在这里查：http://en.cppreference.com/w/Main_Page
user-0 提问: 动态库 地址无关代码PIC

回复:
user: user-0
content: 引用 9 楼 paschen的回复:[quote=引用 2 楼 wsx199397 的回复:] [quote=引用 1 楼 paschen的回复:]因为A、B 和 C、D 的代码有重叠部分，你的p3程序同一个地址上只能放一个，否则你的指针去取这个地址取到的是哪个动态库 那么p1,p2为什么能正常运行?比如说B和C有代码重叠p2要访问c，为什么p2不会访问已经加载到内存的B呢?[/quote]  B和C有重叠无所谓，P2只依赖C和D，不会去加载B[/quote] 谢谢指教。能不能看看我上面理解的对不对。如果对的话很多问题自然就解决了。

user: user-0
content: 引用 10 楼 mLee79的回复:PIC 代码就重定位项少一点, 加载起来方便点而已, M$Win 的DLL不是PIC代码, 不照样跑的好好的么...  各个进程地址空间是隔离的,  缺省指定的 DLL 基址被占用就换个地呗, 做下重定位就是了, 只是修改过后的页在不同进程间就不是共享的了...  在 x86 这种寄存器少的可怜还不能用ip做基址寄存器的破机器上, 生成 PIC代码时还得用本来就很少了的寄存器保存GOT表基址, 太浪费了些...  不过如果要手工写个 elf/pe loader 啥的, 用PIC代码倒是方便多了... 谢谢指教啊。但是能不能看看我上面理解的对不对呀

user: user-0
content: 引用 1 楼 paschen的回复:因为A、B 和 C、D 的代码有重叠部分，你的p3程序同一个地址上只能放一个，否则你的指针去取这个地址取到的是哪个动态库 那么p1,p2为什么能正常运行?比如说B和C有代码重叠p2要访问c，为什么p2不会访问已经加载到内存的B呢?

user: user-1
content: PIC 代码就重定位项少一点, 加载起来方便点而已, M$Win 的DLL不是PIC代码, 不照样跑的好好的么...  各个进程地址空间是隔离的,  缺省指定的 DLL 基址被占用就换个地呗, 做下重定位就是了, 只是修改过后的页在不同进程间就不是共享的了...  在 x86 这种寄存器少的可怜还不能用ip做基址寄存器的破机器上, 生成 PIC代码时还得用本来就很少了的寄存器保存GOT表基址, 太浪费了些...  不过如果要手工写个 elf/pe loader 啥的, 用PIC代码倒是方便多了...

user: user-2
content: 引用 2 楼 wsx199397 的回复:[quote=引用 1 楼 paschen的回复:]因为A、B 和 C、D 的代码有重叠部分，你的p3程序同一个地址上只能放一个，否则你的指针去取这个地址取到的是哪个动态库 那么p1,p2为什么能正常运行?比如说B和C有代码重叠p2要访问c，为什么p2不会访问已经加载到内存的B呢?[/quote]  B和C有重叠无所谓，P2只依赖C和D，不会去加载B

user: user-3
content: 总而言之，汇编语言的功底不到一定程度，讨论这个问题都是在浪费时间。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:The Intel 64 and IA-32 Architectures Software Developer's Manual 赵老师看看我这样理解的对不对哈。如果不采用PIC，那么共享模块的地址在编译期就确定了。这里的地址是虚拟地址。 假设B的虚拟地址是2-8，C的虚拟地址是4-10。对应p1来说访问地址5访问的是模块B而不是C是因为p1并没有用到模块C，所以C不会映射到进程p1的虚拟地址空间中，所以不会产生二义性。

user: user-0
content: 引用 1 楼 paschen 的回复:因为A、B 和 C、D 的代码有重叠部分，你的p3程序同一个地址上只能放一个，否则你的指针去取这个地址取到的是哪个动态库 版主看看我这样理解的对不对哈。如果不采用PIC，那么共享模块的地址在编译期就确定了。这里的地址是虚拟地址。 假设B的虚拟地址是2-8，C的虚拟地址是4-10。对应p1来说访问地址5访问的是模块B而不是C是因为p1并没有用到模块C，所以C不会映射到进程p1的虚拟地址空间中，所以不会产生二义性。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:The Intel 64 and IA-32 Architectures Software Developer's Manual赵老师能不能给个具体点的指点啊，最近就是在看编译链接装载部分。

user: user-3
content: The Intel 64 and IA-32 Architectures Software Developer's Manual

user: user-3
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

user: user-2
content: 因为A、B 和 C、D 的代码有重叠部分，你的p3程序同一个地址上只能放一个，否则你的指针去取这个地址取到的是哪个动态库
user-0 提问: 调用lib失败 fatal error LNK1113: invalid machine type

回复:
user: user-1
content: https://social.msdn.microsoft.com/Forums/vstudio/en-US/d2677732-d756-42e5-b2f1-5b040819c037/error-fatal-error-lnk1113-invalid-machine-type?forum=vcgeneral

user: user-2
content: 如果LNK错误直接是在LNK所提供的lib和dll时，跟厂商确认是否为For PC还是ARM。 如果是报在其他lib上，贴出详细点的

user: user-3
content: 会用dumpbin吗？ 找厂商要调用例子。

user: user-0
content: 软件给出的二次开发的文件都在这里。两个头文件，一个模板，还有一个库。模板里面把调用的函数格式都给我写好了，我自己也用dependency查看过了。 我不知道药怎么查看这个库，在网上查了很久，大抵都是说是动态库有几种什么的。这个要怎么看？我是用的C++6.0编的Win32 DLL，什么样的库我才能调用呢？