Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 如何用freopen重复读文件

回复:
user: user-1
content: 输入流错误后需要重置输入流   int main(void) { 	FILE *p = freopen("s:\\out..txt", "r", stdin);//我的out.txt里是三行，每一行一个字符串和一个数字 	cout << ftell(p) << endl; 	string a; 	int b; 	/*第一次读取开始*/ 	while (cin >> a >> b) 		cout << a << " " << b << endl; 	/*第一次读取结束*/ 	cout << ftell(p) << "\n" << endl;//输出此时文件内部指针的偏移量   	rewind(p);//重置文件指针 	cout << ftell(p) << endl;//确认文件内部指针的偏移量被重置过 							 //    fclose(stdin); 							 //    freopen("out.txt", "r", stdin);  	std::cin.clear(); 	std::cin.ignore(0x7fffffffffffffff, '\n');  	rewind(p);//重置文件指针 	cout << ftell(p) << endl;//确认文件内部指针的偏移量被重置过  	while (cin >> a >> b) 		cout << a << " " << b << endl; 	cout << ftell(p) << endl;//再次输出此时文件内部指针的偏移量 	return 0; }
user-0 提问: 求解，C语言二维数组的行列转换问题

回复:
user: user-1
content: 一样的 行遍历或者列遍历 i, j分别代表行列/列行 复制到另一个数组就是j i进行索引 for(i)     for(j)         dst[j][i] = src[i][j]; //dst代表目标数组，src代表源数组

user: user-2
content: 引用这样调换一下行列行不行？  可以啊，你循环变量的取值范围也要根着改

user: user-3
content: #include <stdio.h>  int main(void) {     int a[3][2] = {{1, 2}, {3, 4}, {5, 6}}, b[2][3];     int i, j;      for (i = 0; i < 3; i++) {         for (j = 0; j < 2; j++) {             b[j][i] = a[i][j];             printf("%d ", a[i][j]);         }         putchar(10);     }      for (j = 0; j < 2; j++) {         for (i = 0; i < 3; i++)             printf("%d ", b[j][i]);         putchar(10);     }     putchar(10);      return 0; } 这样没问题呢 1 2  3 4  5 6  1 3 5  2 4 6 上面是a的输出，下面是b的输出。

user: user-4
content: 结果怎么不对？

user: user-0
content: 我试了一下，结果还是不对。。。实在不知道哪里出问题了

user: user-0
content: [quote=引用 2 楼 jianwen0529 的回复:] 一样的 谢谢

user: user-0
content: [quote=引用 1 楼 paschen 的回复:] 引用这样调换一下行列行不行？  好，谢谢，我待会试试
user-0 提问: 【算法】拷贝某个目录时候实现某些目录过滤功能，各位大神指教

回复:
user: user-1
content: 搜“robocopy”

user: user-2
content: 逐层遍历各级目录，遍历中判断是否满足你要删除的条件进行删除

user: user-3
content: 遍历，取得子目录，剔除目录A，B，复制其他子目录下的目录和文件（遍历及递归）
user-0 提问: 在线等，关于数组做参数的问题！在线等！谢谢！

回复:
user: user-1
content: 既然做参数，首先得有函数调用，这里面有函数调用数组吗？

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

user: user-3
content: 你这个数组没有做参数啊，数组做参不是这样子的

user: user-4
content: 退化为指针，应该是是在形参的时候。比如 int my_strlen(const char src[]);把a传入strlen(a)函数里，那么src接收的是一个数组，但是退化位指针了。 这个确实是数组，不能简单理解位指针,数组的长度是字符串的长度+1；1是指'\0'

user: user-5
content: char *p="1232fgfdfd00"; printf("%d\n",sizeof(p));

user: user-6
content: 《C++函数的数组形参2-2》 http://blog.csdn.net/hou09tian/article/details/78717675 《C++中函数的数组形参2-1》 http://blog.csdn.net/hou09tian/article/details/78046909 希望能够帮到你

user: user-7
content: 你这里并没有用数组作参数，用数组作参数是指参数为a，而不是sizeof(a)

user: user-8
content: void fun(char a[]) //真实类型是char* { printf("%d", a); } int main() { char a[] = "dddddddd"; fun(a); }  引用 1 楼 jianwen0529 的回复:你这个不是参数，sizeof是一个操作符 对于sizeof来说，a就是一个数组，类型是char [11] 对于printf来说，sizeof计算结果才是它的参数，即11

user: user-8
content: 你这个不是参数，sizeof是一个操作符 对于sizeof来说，a就是一个数组，类型是char [11] 对于printf来说，sizeof计算结果才是它的参数，即11
user-0 提问: 关于一些指针内存操作和枚举结构赋值的问题？

回复:
user: user-0
content: 嗯嗯 明白 谢谢各位

user: user-1
content: 枚舉不是結構體，它衹是“列出可能的取值”，也就是説QUEUE_STATE定義之後，取值範圍及每一個成員代表的值就已經固定了。你再定義QUEUE_STATE類型的一個變量，這個變量就衹能在“HoldRequests，AllowRequests，FailRequests”之間取值，并不改變每一個成員所代表的值。

user: user-0
content: 非常感谢第一个问题解决了，第二个还是有点不理解呢  “将QueueState 赋值为FailRequests对应的值，而不是将HoldRequests改为FailRequests”这句话意思是，赋值后，HoldRequests=2，AllowRequests=3，FailRequests=4了么？？？ 如果像2楼所说的QueueState 只是一个整数，QueueState 赋值为FailRequests，QueueState的值是2，那么我要是单独取QueueState.HoldRequests; QueueState.AllowRequests; QueueState.FailRequests那它们分别是多少？

user: user-2
content: 1.是的，它们指向同一块内在地址  2.枚举中的HoldRequests等不是变量，只是一个值，你可自己指定为多少，如果没指定，HoldRequests为0， AllowRequests为1，FailRequests 为2，QueueState = FailRequests;相当于只是在赋值，将QueueState 赋值为FailRequests对应的值，而不是将HoldRequests改为FailRequests

user: user-1
content: 問題1，沒錯，就是一樣的。 問題2，QueueState并沒有“第一個成員”這樣的説法，它衹取枚舉結構的其中一個值，也就是説QueueState其實是個整數。賦值后，QueueState的值是2。如果後面又有一句QueueState = HoldRequest，則它的值變爲0。

user: user-3
content: tmp 和interfaceList 指向同一个内存位置，因此tmp和interfaceList指针变量里存放的数值是一样的。  枚举变量QueueState可以理解成一个int类型的变量。而枚举列表可以理解为一个个的宏定义（整型的）。  QueueState = FailRequests;可以理解为宏定义给int类型赋值。

user: user-0
content: 明白了。先确定范围和具体的值，在定义的该枚举类型变量，取值只能是其中之一。  非常感谢！！！
user-0 提问: C语言不输入任何指令按回车就会正常输出一个人的信息然后录入，输入任何指令就会直接跳出两个人的信息

回复:
user: user-1
content: rewind(stdin);

user: user-2
content: 在scanf("%c“， &stu1[i].record);前加一条语句getchar();用于接收上次输入之后残留在输入缓存里的换行符'\n'； 所有的scanf("%c", &xxx);前面建议根据需要都加getchar();若前面有其他输入，建议加上getchar();否则可以考虑不加；  另外，你的问题恰恰说明fflush(stdin);没有起作用。所以用getchar();替换fflush(stdin);

user: user-0
content: 运行截图
user-0 提问: 大佬，我想用easyx实现“一个气球，点鼠标左键气球消失，用文字显示气球爆了，同时气球消失”怎么改。

回复:
user: user-0
content: 自己解决了。

user: user-1
content: 哇，赵四老师还在这个论坛，我几乎是看着你的帖子学习的~~

user: user-2
content: 百度搜相关关键字。

user: user-0
content: 这是我修改后的代码    // 气球.cpp : Defines the entry point for the console application. //  #include "stdafx.h"  #include "graphics.h" #include <stdlib.h> #include <time.h> #include <stdlib.h> int main(int argc, char* argv[]) { 		     	initgraph(640, 480);         //显示宽为640,高为480的屏幕 	    int x = 320; 	    int y = 240; 		while(true) 		{ 	    MOUSEMSG m;                 //鼠标信息结构体           m = GetMouseMsg();  		switch (m.uMsg)            //鼠标信息 		{ 			 		case WM_LBUTTONDOWN:                 //左键按下 			{ 			  				BeginBatchDraw(); 				IMAGE img1; 				loadimage(&img1, "气球爆了.jpg", 400, 400);  //显示图片 				putimage(100, 100, &img1);   				FlushBatchDraw(); 				EndBatchDraw(); 			  			 			} 		break; 		 		case WM_RBUTTONDOWN:                    //右键按下 			{ 			 					for(y=480;y>0-190;y--) 					{ 						BeginBatchDraw(); 						ellipse(x,y,x+80,y+110);     //画气球头部 						 						line(x+40, y+110, x+40,y+220);    //画气球尾部 						FlushBatchDraw(); 						cleardevice(); 						Sleep(2); 						EndBatchDraw(); 				} 				  			} 			break;  		}		 		} 	 	 		 		system("pause"); 	    closegraph();     	return 0; }
user-0 提问: 有没有研究过unimrcp的朋友，碰到一个比较急的问题，求解决

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

user: user-2
content: mrcp服务器开发，demo,能推荐一点资料吗？谢谢

user: user-0
content: 不是网络导致的丢包，应该是程序本身的问题，我们在这边抓包是没有丢包的。

user: user-3
content: 丢包是不是网络动荡导致的，即网络不好时，来的包都能收到，当网络不好时来的包忽然增多（之前网络不好时在路上的包也一并来了），然后处理模块没有来得及处理导致的丢包；这儿提到的网络是互联网，大网的情况。 如果是网络动荡导致的丢包，可以考虑用缓存环解决。
user-0 提问: 泛型宏的代码判断大小

回复:
user: user-1
content: 这里已经说的比较详细了，看不懂再回复  http://blog.csdn.net/xiaofeng_yan/article/details/5248693

user: user-0
content: 引用 1 楼 hefashion0190 的回复:a = min(10, 5) ==>  a = _min1 < _min2 ? _min1 : _min; 你说的我当然知道，能解释下(void) (&_min1 == &_min2);吗？

user: user-2
content: a = min(10, 5) ==>  a = _min1 < _min2 ? _min1 : _min;
user-0 提问: 菜鸟求助！自己定义的power函数，最后得数都是0，实在不知道哪里出了问题，求大神指导！

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <math.h>  double power(double a,int n);  int main() {     int n;     double a, s;     printf("请输入底数a：");     scanf("%lf,",&a);     printf("请输入指数n：");     scanf("%d", &n);     s = power(a,n);     printf("%lf\n",s); }  double power(double a, int n) {     int i;     double s = 1.0;     for(i = 0; i < abs(n); i++)         s *= a;     if (n < 0)         return 1.0/s;     return s; } 考虑幂是负数的情况

user: user-1
content: 第一个问题：double类型应该用%lf格式接收收入的数据： scanf("%lf,",&a); 第二个问题：s应该定义成double类型，因为接收的是double的返回值，并且输出是应该用%lf #include <stdio.h>  double power(double a,int n);  int main() {     int n;     double a, s;     printf("请输入底数a：");     scanf("%lf,",&a);     printf("请输入指数n：");     scanf("%d", &n);     s = power(a,n);     printf("%lf\n",s); }  double power(double a,int n) {     int i;     double s = 1.0;     for(i = 0; i < n; i++)         s *= a;      return s; } 参考一下吧

user: user-2
content: #include"stdio.h" double power(double a,int n); main() { 	int n,s; 	double a; 	printf("请输入底数a："); 	scanf("%f,",&a);                          // a  定义为double类型，但是你sancf 函数内应该使用 %lf 才对，而你使用的是  %f ,这样就会造成你输入的a的值不正确  	printf("请输入指数n："); 	scanf("%d",&n); 	s=power(a,n);                            // 你power函数的返回值是一个 double 类型的值，所以 s 也应该定义成double类型，但是你程序是定义成 int 类型 	printf("%f",s); } double power(double a,int n) { 	int i; 	double s=1.0; 	for(i=1;i<=n;i++) 	{ 		s*=a; 	} 	return s; } 以上你的代码中，我看出来的错误。 在这里我们假设采用的是32位，int  4 Byte float 4 Byte double  8 Byte  简单介绍一下汇编中数据的存储，首先你 a 定义的double类型的变量，因此在内存中就分配了double类型大小的内存空间，我们使用的double 是8 Byte 的大小， 内存中，数据的存储是高位的存放在高地址，地位的存放在低地址。所以你在sanf函数获取输入时%f 取到 的 a 的地址并不是 a实际开始存放的地址，因此你输入的数值存储在错位的地址中，但是你程序调用的 a 使用的是a实际开始的地址，因此，程序调用到的 a 值并不是 你所输入的 a 的值。(PS: 我实际调试中，根据调试程序的内存地址，有看到 %f 和 %lf 开始存放的地址明显是不一样的) 接下去是 s 的返回值为什么会变成0，虽然 从 a开始获取到的值 并不是 你输入的a值，但是power还是正常调用了。说起来还是和上面讲的内存中数据的存储有关。所以你只要将程序修改为  #include"stdio.h" double power(double a,int n); main() { 	int n; 	double s; 	double a; 	printf("请输入底数a："); 	scanf("%lf,",&a); 	printf("请输入指数n："); 	scanf("%d",&n); 	s=power(a,n); 	printf("%f",s); } double power(double a,int n) { 	int i; 	double s=1.0; 	for(i=1;i<=n;i++) 	{ 		s*=a; 	} 	return s; }  还有，楼上的那位说的也没错，你要考虑到指数为负数的情况，以下是引用他的代码  #include <stdio.h> #include <stdlib.h> #include <math.h>   double power(double a,int n);   int main() {     int n;     double a, s;     printf("请输入底数a：");     scanf("%lf,",&a);     printf("请输入指数n：");     scanf("%d", &n);     s = power(a,n);     printf("%lf\n",s); }   double power(double a, int n) {     int i;     double s = 1.0;     for(i = 0; i < abs(n); i++)         s *= a;     if (n < 0)         return 1.0/s;     return s; }

user: user-3
content: main 里的s是int 的如果结果小于0 不就截掉了吗

user: user-0
content: 不是啊，在main中s我定义的是double型的

user: user-4
content: 函数类型是double，，main里的s是int，类型不一样
user-0 提问: 求教，关于服务器端代码出现问题

回复:
user: user-1
content: #define _WINSOCK_DEPRECATED_NO_WARNINGS

user: user-0
content: 1萨达大厦撒

user: user-0
content: 引用 2 楼 user-2 的回复:lz的代码缺少lib库 增加 #pragma comment(lib, "Ws2_32.lib") 谢谢啦，第二种没问题了，但是这样添加了第一种问题还是会出现

user: user-2
content: lz的代码缺少lib库 增加 #pragma comment(lib, "Ws2_32.lib")

user: user-0
content: 是用VS2017编译的，也尝试在visual C++6.0编译，也提示了类似错误
user-0 提问: linux c socket 编程 send()方法乱码

回复:
user: user-0
content: 解决了！FTP协议漏看了一个地方！

user: user-1
content: vsftp客户端是把socket绑定到了两个文件流上了，所以你每次发送数据的时候带上'\n'，这样缓冲区会被刷新，不会留下乱七八糟的东西。

user: user-2
content: http://blog.sina.com.cn/s/articlelist_1595473800_6_1.html 我这里好像有写过，你看看是否对你有帮助

user: user-3
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-4
content: printf("%s %d login success\n", usernames[user_state->user_index], user_state->isLogin); 看一下这句打印的是不是乱码，如果这句里有乱码，那么发过去的就会有乱码；

user: user-0

user: user-0
content: 就是最后send出去的respone数据在vsftpd客户端接收到后前面会有乱码

user: user-0
content: void ftp_pass(Command *cmd, State *user_state) { 	char *respone = malloc(BUFSIZ); 	if(strcmp(passwords[user_state->user_index], cmd->arg) == 0) 	{ 		// 密码正确 		user_state->isLogin = 1; 		printf("%s %d login success\n", usernames[user_state->user_index], user_state->isLogin); 		sprintf(respone, "230 %s Login successful\n", usernames[user_state->user_index]); 	} 	else 	{ 		// 密码不正确 		user_state->isLogin = 0; 		printf("%s login failed\n", usernames[user_state->user_index]);  		sprintf(respone, "500 user %s Invalid password\n", usernames[user_state->user_index]); 	} 	printf("%s", respone);  	respone[strlen(respone)] = '\0'; 	send(user_state->connection, respone, strlen(respone), 0); 	// write(user_state->connection, respone, sizeof(respone)); }

user: user-5
content: 要把你的代码贴出来给大家看看，才知道问题在哪里

user: user-4
content: 建议贴出发送端和接收端收发数据的部分处理操作。
user-0 提问: 怎样用combo box作出一个小型计算器

回复:
user: user-0
content: 引用 2 楼 paschen 的回复:不能这样（(CString)i）把整数转换成CString，你要用CString的Format进行转换  感谢分享，已经解决。

user: user-1
content: 不能这样（(CString)i）把整数转换成CString，你要用CString的Format进行转换

user: user-2
content: 所有 ，有什么问题，说明白哈
user-0 提问: 麻烦大佬们看看小白这个链表删除函数哪里有问题

回复:
user: user-1
content: void Delete(pNODE head,int x) {     pNODE p=head->next;     int i=1;     pNODE q=NULL;     while(p->next!=NULL&&i<x)     {         p=p->next;         i++;     }     if (p->next == NULL || i > x) {    /*x可能为0*/         printf("Can't find it!\n");         printf("ERROR!");         return;    /* 必须退出函数，否则后面执行了就会有问题*/     }     q = p->next;     p->next = q->next;      free(q); } 参考一下吧

user: user-1
content: 引用 1 楼 user-3 的回复:if(p->next=NULL&&i>x)//这个始终为真啊 要改为p->next==NULL 始终为假才对，因为本来应该是判断表达式，而写成赋值表达式，由于NULL是(void *)0，因此将NULL赋值给p->next，那么p->next为假，后面是&&，所以一直为假。

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

user: user-3
content: if(p->next=NULL&&i>x)//这个始终为真啊 要改为p->next==NULL
user-0 提问: Bug

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

user: user-2
content: 引用 2 楼 cfjtaishan 的回复:#include <stdio.h> #include <stdlib.h>  typedef struct stu {     int student_number;     char name[20];     float grade[3];     struct stu *next; }s;  int n;   /*全局变量不需初始化位0*/  struct stu *creat() {     s *p1,*p2,*head;     int i=0;     p2 = p1 = (s *)malloc(sizeof(s));     if (!p1)         exit(0);     p1->next = NULL;     //if(n=0)     if(n==0)   /* == not = */         head = p1;     printf("Please input student number:\n");     scanf("%d",&(p1->student_number));     getchar();     printf("Please input student name:\n");     scanf("%c",&p1->name[i]);     while(p1->name[i] != '\n' && i < 20 - 1)     {         i++;         scanf("%c",&p1->name[i]);     }     p1->name[i] = 0;      printf("What are grades?\n");     scanf("%f %f %f",&(p1->grade[0]),&(p1->grade[1]),&(p1->grade[2]));      n += 1;     return (head); };  struct stu *output(s *head) {     s *p1;     p1 = head;     printf("Here are all informations:\nStudent number         Name         grade1   grade2   grade3\n");     while(p1)     {         printf("%10d    %20s   %.2f   %.2f   %.2f\n",p1->student_number,p1->name,p1->grade[0],p1->grade[1],p1->grade[2]);         p1 = p1->next;     } };  int main() {     s *head;     head = creat();     output(head);     return 0; } 参考一下吧  grades数组下表应该是从0开始的。 name是字符数组，若要以%s输出需要给末尾加'\0'；并且注意name越界的问题。即i <20-1是必须的。 head应该是指向p1的，而不是p1->next; output函数里，要先让p1指向head，否则会造成无限循环；  其他问题建议对照代码看一下  楼上是真的强，帮人帮的真彻底

user: user-3
content: #include <stdio.h> #include <stdlib.h>  typedef struct stu {     int student_number;     char name[20];     float grade[3];     struct stu *next; }s;  int n;   /*全局变量不需初始化位0*/  struct stu *creat() {     s *p1,*p2,*head;     int i=0;     p2 = p1 = (s *)malloc(sizeof(s));     if (!p1)         exit(0);     p1->next = NULL;     //if(n=0)     if(n==0)   /* == not = */         head = p1;     printf("Please input student number:\n");     scanf("%d",&(p1->student_number));     getchar();     printf("Please input student name:\n");     scanf("%c",&p1->name[i]);     while(p1->name[i] != '\n' && i < 20 - 1)     {         i++;         scanf("%c",&p1->name[i]);     }     p1->name[i] = 0;      printf("What are grades?\n");     scanf("%f %f %f",&(p1->grade[0]),&(p1->grade[1]),&(p1->grade[2]));      n += 1;     return (head); };  struct stu *output(s *head) {     s *p1;     p1 = head;     printf("Here are all informations:\nStudent number         Name         grade1   grade2   grade3\n");     while(p1)     {         printf("%10d    %20s   %.2f   %.2f   %.2f\n",p1->student_number,p1->name,p1->grade[0],p1->grade[1],p1->grade[2]);         p1 = p1->next;     } };  int main() {     s *head;     head = creat();     output(head);     return 0; } 参考一下吧  grades数组下表应该是从0开始的。 name是字符数组，若要以%s输出需要给末尾加'\0'；并且注意name越界的问题。即i <20-1是必须的。 head应该是指向p1的，而不是p1->next; output函数里，要先让p1指向head，否则会造成无限循环；  其他问题建议对照代码看一下

user: user-4
content: &(p1->grade[3])  访问越界
user-0 提问: 以下代码有三处错误，请找到错误并用文字描述错误修改方法

回复:
user: user-1
content: 问题1：s是野指针，为对其分配有效的内存空间就是用，很可能会导致段错误； 问题2：free(s);free是与malloc/realloc/calloc其中之一匹配使用，没有申请空间的操作，就没有free的操作；因此此处也是可能导致段错误； 问题3：返回局部内存空间地址，这是未定义的操作，因为局部变量的生命周期是从定义开始到函数调用结束而结束；因此局部变量再已经释放后再使用，结果是未定义的。 问题4：sizeof是一个宏，主要是计算某个变量类型的大小，比如sizeof(int)即4(32位系统里），int a; sizeof(a)其实也是计算a类型占内存的大小，和sizeof(int)是一样的，因为a的类型是int；sizeof(s)，由于s是指针，因此sizeof(s)等价于sizeof(int *);大小也是4；若sizeof(ss),由于ss是数组，因此计算的是数组占的内存大小，即sizeof(char) * N;  #include<stdio.h> #include <stdlib.h> #include<string.h>  #define N 80  char* myStrcpy(char *s) {     int i;     char *ss = (char *)malloc(sizeof(char) * N);     if (!ss)         exit(0);      for(i = 0; s[i]; i++)         ss[i] = s[i];      return ss; }  int main() {     char *s, *str = NULL;     s = (char *)malloc(sizeof(char) * N);     if (!s)         return -1;     scanf("%s", s);     str = myStrcpy(s);     printf("%s\n", str);      free(s);     free(str);     return 0; }  修改后的。栈上的空间，生命周期是从申请开始知道free之前

user: user-2
content: 1、函数myStrcpy里对参数s的sizeof运算，得到的结果是字符指针所占空间大小，获取字符串长度的正确方法是strlen； 2、函数myStrcpy不能直接返回ss； 3、main函数中，s未用malloc或alloc分配内存，故不能直接scanf输入，亦不能用free释放内存。

user: user-3
content: char ss[N];  //数组定义未进行初始化 return ss; //此句前面要给数组的最后加'\0',否则不是完整的数组 free(s);  //free应与malloc函数配套使用，若要是用free函数，前面指针定义应该改成char *s=malloc(N*sizeof(char));
user-0 提问: C语言中单引号与双引号的区别？

回复:
user: user-1
content: 双引号“”是字符串，以\0结尾。 单引号''是字符。 char本身只能保存一个字符，所以语句 char a = "A";  你用的编译器虽然通过，但是也报了警告。警告的原因是数据类型需要强制转换，你用编译器跟进去看看，41可能就是字符串"A"的地址。

user: user-2
content: char a = "A"; 把字符串 A 的首地址赋值给 a，这个过程将地址的值 (32为4字节，64位8字节) 截断为 1 字节。结果是不确定的，运行时才能知道。

user: user-3
content: 引用 3 楼 cfjtaishan 的回复:单引号指字符，双引号指字符串。用字符去存储字符串肯定会给警告； 因为字符串至少是赋值给字符数组或者字符指针。 警告的原因是类型不匹配。

user: user-3
content: 单引号指字符，双引号指字符串。用字符去存储字符串肯定会给警告； 因为字符串至少是赋值给字符数组或者字符指针。

user: user-4
content: 两者是不同的 'A’代表的是一个整数，而且这个整数对应的是编译器所采用的字符集中的字符序列对应的数值; "A"是个字符串， printf("%d\n",a)，使用了%d, 就要进行转换， 这也是编译提示警告的原因

user: user-5
content: 因为单引号表示一个字符他与ASCII码对应。双引号就代表字符串，系统会自动给字符串末尾加上'\0'
user-0 提问: 【形参和实参的地址】

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

user: user-2
content: 谁说是按地址传递，这明明是按值传递，形参是通过实参复制来的，本身就是两个变量，地址当然不一样了

user: user-3
content: 什么叫”按地址传递参数“？形参和实参是两个对象，在你的程序里就是有两个a。 另外用%p输出int*是未定义行为，见：https://stackoverflow.com/questions/9056328/printf-and-pointers，需要显示转换成void*。
user-0 提问: 数组实际运用上的一点小问题，求解决

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

user: user-2
content: 你Conut声明错了，声明和实现时写的不一致，把声明里第三个参数改成int aver[]

user: user-3
content: #include "stdafx.h"  #define I 40 #define J 3  void Readscore(int s[][3], int n); int Conut(int s[][3],int sum[],int aver[], int n);  int main() {     int s[I][J], n, sum[I], aver[I],i;     printf("Plase enter the students numbers:");     scanf_s("%d", &n);     Readscore(s, n);                                         /*读入n个学生三科的成绩*/     Conut(s, sum, aver, n);     for (i = 0;i < n; i++)     {         printf("第%d号学生 总分为:%d  平均分为: %d", i, sum[i], aver[i]);     }      return 0; }  void Readscore(int s[][3], int n) {     int i, j;     printf("请分别输入学生三科的成绩:");     for (i = 0; i < n;i++)     {         for (j = 0;j < 3;j++)         {             scanf_s("%d", &s[i][j]);         }     } }  int Conut(int s[][3],int sum[],int aver[],int n) {     int i,j;     for (i = 0;i < n;i++)     {         sum[i] = 0;         for (j = 0;j < 3;j++)         {             sum[i] = sum[i] + s[i][j];         }         aver[i] = sum[i] / 3;     }      return 0; } 参考一下吧  Conut函数声明和定义参数类型不一致，看一下aver类型是否一致； Readscore函数缺少参数，该函数里的n是局部变量，并且是未初始化。从逻辑上考虑，应该是用main函数里的n变量，因此应该加一个形参，然后接收main函数里的n值。

user: user-4
content: #include "stdafx.h" #define I 40 #define J 3 void Readscore(int s[][3],int n); int Conut(int s[][3],int sum[],int aver[],int n);//这个地方楼主的声明和定义的参数不一致，声明是整形的，定义却是数组类型   int main() { 	int s[I][J], n, sum[I], aver[I],i; 	printf("Plase enter the students numbers:"); 	scanf_s("%d", &n); 	Readscore(s,n);                                         /*读入n个学生三科的成绩*/   	Conut(s, sum, aver, n); 	for (i = 0;i < n;i++) 	{ 		printf("第%d号学生 总分为:%d  平均分为: %d", i, sum[i], aver[i]); 	}  	return 0; }  void Readscore(int s[][3],int n)	//这个地方应该参数少了整形一个变量 int n ; { 	int i;int j;  	printf("请分别输入学生三科的成绩:"); 	for (i = 0;i < n;i++) 	{ 		for (j = 0;j < 3;j++) 		{ 			scanf_s("%d", &s[i][j]); 		} 	} }  int Conut(int s[][3],int sum[],int aver[],int n) { 	int i,j; 	for (i = 0;i < n;i++) 	{ 		sum[i] = 0; 		for (j = 0;j < 3;j++) 		{ 			sum[i] = sum[i] + s[i][j]; 		} 		aver[i] = sum[i] / 3;  	} 	return 0; }  楼主还是要自己多自己检查自己的代码

user: user-5
content: #include <stdlib.h> #include <stdio.h> #define I 40 #define J 3 void Readscore(int s[][3], int n); int Conut(int s[][3],int sum[],int aver[], int n);   int main() { 	int s[I][J], sum[I], aver[I]; 	 	int n = 0;  	printf("Plase enter the students numbers:");  	scanf("%d", &n);  	 	if(n<1 || n>40){ 		puts("n range error"); 	} 	Readscore(s, n);                                         /*读入n个学生三科的成绩*/    	Conut(s, sum, aver, n); 	for(int i=0; i<n; i++){  		printf("第%d号学生 总分为:%d  平均分为: %d", i, sum[i], aver[i]);  	}  	return 0; }   void Readscore(int s[][3], int n) { 	printf("请分别输入学生三科的成绩:"); 	for (int i = 0;i < n;i++){ 		for (int j = 0;j < 3;j++){  			scanf("%d", &s[i][j]);  		}  	} }   int Conut(int s[][3],int sum[],int aver[],int n) { 	for (int i = 0;i < n;i++){  		sum[i] = 0;  		for (int j = 0;j < 3;j++){  			sum[i] = sum[i] + s[i][j];  		}  		aver[i] = sum[i] / 3;  	} } 编译:gcc test.c -std=c99 -o test 操作系统:ubuntu14 64位 上面代码可以正常工作。
user-0 提问: 函数的调用

回复:
user: user-1
content: 递归的参数表里只有一个参数；应该是两个参数；  j=age(k-1)+2; 根据自己的逻辑改一下这个地方；  另外，还有一个错误，这个错误是大家都容易犯的错误。  //if(k=1)     if(k==1) 应该是判断语句，不是赋值语句；

user: user-2
content: j=age(k-1)+2;这一句应该传入两个参数，楼主只传入了一个

user: user-3
content: j=age(k-1)+2;

user: user-4
content: #include <stdio.h>  int main()  {  int age(int k,int l);  int a,i,z;  printf("Please input the first student's age:\n");  scanf_s("%d",&a);  printf("Please input the student who you want to know 's number:\n");  scanf_s("%d",&i);  z=age(i,a);  printf("So the %d 's age is: ",i);  return  0;  }   int age(int k,int l)  {  int j;  if(k=1)  j=l;  else  j=age(k-1,2);  return j;  }

user: user-5
content: 楼上正解  你在递归的时候只传了一个参数
user-0 提问: 大一新生C语言求助。

回复:
user: user-1
content: 可以再“调试”中设置断点，F5运行，进行调试，看堆栈，看看问题出在哪里了，在通过F10，F11通过逐步或逐过程进行调试

user: user-0
content: 引用 10 楼 SXJIAKE 的回复:[quote=引用 6 楼 zaokang5603 的回复:] 我说两点吧： 1.int *p1 = (int *)a; //     int *p2 = (int *)b;   这个代码有问题，上面执行的结果就是把Assisc码转化为整形，例如‘a’变为整形就是97，你可以试着通过下面的函数进行转化：int  atoi（char *）;  1.int c[n1], d[n2] n1和n2没有初始化，应该编译不过去吧， 	for (n = 0; n<n1; n++)//分别赋值到两个数组。  	{ 		c[n] = *(p1 + n); 	} 	for (n = 0; n<n2; n++) 	{ 		d[n] = *(p2 + n); 	} 其实可以给c[100],d[100],想把指针里的内容复制到数组中，可以通过结束符‘\0’判断停止如果你是将 acsii 转为整型，需要转吗？直接用不就是了吗？再说了，也不能 char * 到 int *，一个 1 字节指针,一个 4 字节指针，怎么转?[/quote]我懂了

user: user-2
content: 调试：可以用输出某些值，来判断错误，这种方法比较简单

user: user-1
content: 是不是就是任意两个字符整数相加，最后输出就可以了，怎么感觉你的代码弄得复杂了呢 下面代码仅供参考：  char *a,*b; a=(char *)malloc(100); b=(char *)malloc(100); scanf("%s%s",a,b);//以字符串形式输入 int  num1 =atoi (a); int num2 =atoi(b); int sum =num1 +num2; printf("%d\n",sum); 而且在控制台就是以字符串输入的，我们使用scanf("%d%d",a,b)把字符串格式化为为整形复制给a和b。所以 int a,b; scanf("%d%d",&a,&b);//以字符串形式输入 int  sum =a+b; 可能我理解的有问题把，仅供参考

user: user-1
content: 我说两点吧： 1.int *p1 = (int *)a; //     int *p2 = (int *)b;   这个代码有问题，上面执行的结果就是把Assisc码转化为整形，例如‘a’变为整形就是97，你可以试着通过下面的函数进行转化：int  atoi（char *）;  1.int c[n1], d[n2] n1和n2没有初始化，应该编译不过去吧， 	for (n = 0; n<n1; n++)//分别赋值到两个数组。  	{ 		c[n] = *(p1 + n); 	} 	for (n = 0; n<n2; n++) 	{ 		d[n] = *(p2 + n); 	} 其实可以给c[100],d[100],想把指针里的内容复制到数组中，可以通过结束符‘\0’判断停止

user: user-3
content: 原来字符串数组可以强转为数字数组，开眼界了……int *p1=(int *)a; //转化为整形。  int *p2=(int *)b;

user: user-3
content: 引用 6 楼 zaokang5603 的回复:我说两点吧： 1.int *p1 = (int *)a; //     int *p2 = (int *)b;   这个代码有问题，上面执行的结果就是把Assisc码转化为整形，例如‘a’变为整形就是97，你可以试着通过下面的函数进行转化：int  atoi（char *）;  1.int c[n1], d[n2] n1和n2没有初始化，应该编译不过去吧， 	for (n = 0; n<n1; n++)//分别赋值到两个数组。  	{ 		c[n] = *(p1 + n); 	} 	for (n = 0; n<n2; n++) 	{ 		d[n] = *(p2 + n); 	} 其实可以给c[100],d[100],想把指针里的内容复制到数组中，可以通过结束符‘\0’判断停止如果你是将 acsii 转为整型，需要转吗？直接用不就是了吗？再说了，也不能 char * 到 int *，一个 1 字节指针,一个 4 字节指针，怎么转?

user: user-0
content: 知道了些我还不太会，继续学习。

user: user-0
content: 引用 3 楼 user-4 的回复:出错了中断下来，通过调用堆栈定位到相关位置，分析原因你说的什么调用的我都不会。。

user: user-4
content: 出错了中断下来，通过调用堆栈定位到相关位置，分析原因

user: user-0
content: #include<stdio.h> #include<string.h> #include<stdlib.h> int n1,n2,h[1000]; int main() { 	void sum(int *a,int *b,int k1,int k2);//相加函数。  	char *a,*b; 	a=(char *)malloc(100); 	b=(char *)malloc(100); 	scanf("%s%s",a,b);//以字符串形式输入。  	n1=strlen(a); //得出位数。  	n2=strlen(b); 	int *p1=(int *)a; //转化为整形。  	int *p2=(int *)b; 	int c[n1],d[n2],n; 	for(n=0;n<n1;n++)//分别赋值到两个数组。  	{ 		c[n]=*(p1+n); 	} 	for(n=0;n<n2;n++) 	{ 		d[n]=*(p2+n); 	} 	sum(c,d,n1,n2); 	for(n=0;n<1000;n++)//输出相加结果。  	{ 		if((h[n])=='\0')  continue; 		printf("%d",h[n]); 	} 	return 0; } void sum(int *a,int *b,int k1,int k2) { 	int m1,m2,c,n=999; 	for(m1=k1-1,m2=k2-1;(m1>=0)&&(m2>=0);m1--,m2--,n--)//从个为开始加，当有其中一个数位数加尽了停止循环。  	{ 		if(c=(*(a+m1)+*(b+m2)+h[n])>9)//当两个相同位和h数组(即可能上一位进了一)相加大于9时。  		{ 			h[n]=c-10;//和为相加和减去10加上本身的值.  			h[n-1]++; 		} 		else  h[n]=(*(a+m1)+*(b+m2))+h[n];//如没有大于9则不用减10.  		while((m1<0)&&(m2>=0))//即当a数组位数小时。  		{ 			h[n--]=b[m2--]; 		} 		while(m2<0&&m1>=0) 		{ 			h[n--]=b[m1--]; 		} 	}	  } 这是我的代码上面好像发的的乱了

user: user-0
user-0 提问: 【char指针的疑问】

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

user: user-2
content: c指向了字符串的首地址啊，只是改变了c的指向，没有改变C指向内存的内容

user: user-3
content: 表达式“Hello world”的值是char[]类型的，char[]是不是可以赋值给 char* 呢

user: user-4
content: 3、*p=12 这句将可能导致出错，因为p还没指向一块有效内存，p是一个野指针，此时解引可能导致程序崩溃

user: user-5
content: *p = 12这个操作可能会导致段错误；因为p是野指针。  "Hello world"字符串不是13个字符，而是12个字符；算上'\0'也是12个字符；该字符串是字符串常量，是在只读数据段上申请空间和存放，而申请空间的首地址会存放在指针变量c中。*c是访问字符串的第一个字符；因为c存放的是字符串的首地址，因此*c就是*(c + 0)的意思，即c相对于字符串首地址向后偏移0个字节，即第一个字符。 输出字符串时，c存放的是首地址，输出时是从首地址开始将每个字符输出直到遇到'\0'，停止输出。

user: user-4
content: 1、“Hello world”实际是const char[]类型，可退化为指针，相当于p是指向这个字符串首地址

user: user-4
content: 2、只是指向这个字符串的开头位置，*c的值是'H'，如果要按字节读取后面的，需要身后移动c

user: user-0
content: 大家，怎么没有一个人答道点子上： 既然c是一个指针，为什么可以对其赋值赋予的不是地址而是「字面量」

user: user-6
content: c风格的字符串是用首地址+结束符'\0'来组合使用的，char *c="Hello World";表示你把常量字符串的第一个字符'H'(首地址)保存在了c指针里头，这个常量字符串末尾隐含一个结束符。所以说这个字符串的size=12（包含那个隐含的结束符）。如果你输出c+2,则会输出 llo World,自己慢慢理解吧

user: user-7
content: 2楼说得对，直接给*c赋值只能赋一个字符，你可以试试用指针指向这个字符，输出*c，发现只能输出一个字符，而输出c的话就是整个字符串了

user: user-8
content: 引用 6 楼 qq_38204686 的回复:[quote=引用 5 楼 das白的回复:]这里赋的是这个字符串的首地址 ""默认加\0 等价于 *c = "" 不要问我为什么 我不知道 编译器就这样的 你可以看看反汇编  坐等大神回答[/quote]  怎么会等价于*c = ""呢？ *c分明是char类型，怎么会等于“”，字符串。应该是*c=‘a’；才对啊。

user: user-9
content: 引用 5 楼 das白的回复:这里赋的是这个字符串的首地址 ""默认加\0 等价于 *c = "" 不要问我为什么 我不知道 编译器就这样的 你可以看看反汇编  坐等大神回答

user: user-9
content: 这里赋的是这个字符串的首地址 ""默认加\0

user: user-0
content: 赋给指针变量的「值」既然是地址，为什么这里只饥饿赋给一串「字面量」？？？

user: user-0
content: 为什么是c=“Hello world”

user: user-8
content: 其实我没太看懂你一楼的描述。直接回答后面的 为什么不是*c="Hello world"？ *c应该只是一个字符char类型，他怎么能等于一个字符串呢！就算用*c，也应该是*c = ‘a’; 也不能是等于字符串！

user: user-0
content: 特别是注意这里，为什么不是*c="Hello world"？不是解指针后才是表示所指向的内容吗，但是这样的话也只能表示所指向的某一个字符啊？？
user-0 提问: 问题：人带着狼羊白菜过河，在没有人的时候狼会吃羊， 羊会吃白菜， 船每次只能乘人以及狼羊白菜其中一个，问最少经过多少步并输出步数

回复:
user: user-1
content: 百度搜相关关键字。
user-0 提问: 求助！大佬们快来啊

回复:
user: user-1
content: #include "stdafx.h" #include<string.h> #include<stdlib.h>  struct student { 	int num; 	struct student *next; }; int n; #define max sizeof(struct student)  struct student *linklist()  { 	struct student *p, *q; 	struct student *head; 	n = 0; 	p = q = (struct student *)malloc(max); 	if (!p) 		exit(0); 	scanf_s("%d", &p->num); 	head = NULL; 	while (p->num != 0) { 		n = n + 1; 		if (n == 1) 			head = p; 		else  			q->next = p; 		q = p; 		p = (struct student *)malloc(max); 		if (!p) 			exit(0); 		scanf_s("%d", &p->num); 	} 	q->next = NULL; 	free(p);  	return(head); }  void main() {  	struct student *d; 	d = linklist(); 	for ( ;d != NULL;d = d->next) 		printf("%d", d->num); 	printf("\n"); 	system("pause"); } 建议查一下scanf_s的使用，第三个参数若输入的是整型数，第三个参数可以省略，因为默认是4字节，但是若第三个参数是5，那么就会有问题了。int是应该是4字节，不是5字节。 还有退出循环是需要输入0

user: user-2
content: 看了一下，程序没什么问题，但是存在内存泄漏，只malloc了空间后面没有释放 while (p->num != 0)，当你输入0的时候才结束，执行后续的打印
user-0 提问: 新手抓破脑袋不知道错在哪里

回复:
user: user-1
content: 用 scanf_s 输入一个字符串： #include<stdio.h> int main() { char a[20]; scanf_s("%s",a,20);        /*a,20中的 ,20 是用来指定缓冲区大小的参数，表示最多读取n-1个字符，不加的话，编译器会出错，无法进行正常的字符串输入*/ printf("输入的字符串是:%s\n",a); return 0; }

user: user-2
content: scanf_s("%s",e, 10);

user: user-3
content: char e[10];  printf("what fuck:"); scanf_s("%s",e, 10); printf("what fuck:%s\n", e); 两步：去'\n'，加一个参数10；

user: user-4
content: 用scanf_s获取字符串时，要指定大小。 scanf_s("%s",e, 10);

user: user-5
content: scanf_s("%s",e, 10);

user: user-0
content: 不行 我还是乱码的  char e[10];	 	puts("hello man"); 	scanf_s("%s", e);  	printf("what the hell:%s\n", e);

user: user-6
content: scanf_s("%s\n",e);把\n去掉

user: user-7
content: scanf_s("%s", e， 10);

user: user-8
content: 查了下帮助文档，scanf_s输入字符串的用法是这样的 scanf_s("%s",e,sizeof(e)); 也就是说要还需要一个参数表明e的大小

user: user-9
content: 初始化数组e试试 char e[10]={};
user-0 提问: 一变二编码是什么

回复:
user: user-0
content: 引用 6 楼 shihengzhen101 的回复:[quote=引用 5 楼 xuebing1995 的回复:] [quote=引用 4 楼 shihengzhen101 的回复:] 没有听说过这种描述方法，上下文中有没有关于这种编码的解释呢？  是BCD码  [/quote] 那就好说了额，最常用的不是8421码吗，转换一下就行了[/quote] 嗯，这个我懂

user: user-1
content: 引用 5 楼 xuebing1995 的回复:[quote=引用 4 楼 shihengzhen101 的回复:] 没有听说过这种描述方法，上下文中有没有关于这种编码的解释呢？  是BCD码  [/quote] 那就好说了额，最常用的不是8421码吗，转换一下就行了

user: user-0
content: 引用 4 楼 shihengzhen101 的回复:没有听说过这种描述方法，上下文中有没有关于这种编码的解释呢？  是BCD码

user: user-1
content: 没有听说过这种描述方法，上下文中有没有关于这种编码的解释呢？

user: user-2
content: 不确定是什么编码，不过看他这意思很可能是把一个字节的高低4位各转换为一个数字0~F，以ASCII编码存储，比如0x80变成"80"，就是两个字节了。

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:没听说过这样的编码 原话是这么说的： 接受客户端的请求，并将客户端的ip地址、接收数据的时间、数据状态（是否加密）、数据前的16字节(注意此处数据如果是密的不需要解密)做1变2编码保存到数据库。

user: user-3
content: 没听说过这样的编码
user-0 提问: 萌新求助

回复:
user: user-0
content: 感谢大佬，这个是去年的问题现在才看，就是你说的那样

user: user-1
content: void query_big_info() {     float x,y;     puts("输入价格范围x和y（中间用空格隔开）");     scanf("%f%f",&x,&y);     int i;     struct Info *head=NULL,*tmp=NULL;     for (i=0; i<30; i++)     {         if(info[i].total>=x&&info[i].total<=y)         {             if(!tmp)             {                 tmp=&info[i];                 head=tmp;             }             else             {                 tmp->next=&info[i];                 tmp=tmp->next;             }         }     }     tmp->next = NULL;      tmp = head;     printf("序号   种类    单价   数量    总价    支付    找零    卡号    购前    购后\n");     while(tmp)     {         printf("%4.4d  %s   %.2f   %.2f   %.2f  %.2f  %.2f   %d  %.2f  %.2f",                 tmp->id, fruit[tmp->ftype].fname, tmp->price, info->fnum,                 tmp->total, tmp->pay, tmp->ret, tmp->cardid, tmp->befpay,                 tmp->aftpay);         printf("时间: %d:%d\n", tmp->hour, tmp->minute);         /*         printf("%4.4d  %s   %.2f   %.2f   %.2f  %.2f  %.2f   %d  %.2f  %.2f",                info[i].id,                fruit[info[i].ftype].fname,                info[i].price,                info[i].fnum,                info[i].total,                info[i].pay,                info[i].ret,                info[i].cardid,                info[i].befpay,                info[i].aftpay);         printf("时间: %d:%d\n",info[i].hour,info[i].minute);         */         tmp = tmp->next;     } } 参考一下吧；  另外，自己数一下%d，%f个数和后面的参数是否是一一对应的，包括参数类型。 fscanf(fp,"%d%s%f%f%f%f%d%f%f%d%d",                &info[i].id,                fname,                &info[i].fnum,                &info[i].total,                &info[i].pay,                &info[i].ret,                &info[i].cardid,                &info[i].befpay,                &info[i].aftpay,                &info[i].hour,                &info[i].minute               ); scanf("%f%f",&x,&y); float类型应该以%f接收吧，double采用%lf
user-0 提问: 关于出圈问题，自己测试正确，但是oj过不去，问题出在哪里？（ps：初学者，大神勿喷）

回复:
user: user-0
content: 简单测试是正确的，背后测试数据库就不是很清楚了。想请教一下。

user: user-1
content: 数据很大的时候O(n*m)估计是过不去了，你百度下约瑟夫环的数学推导算法，那个是O(N)的，肯定能过去

user: user-1
content: #include <stdio.h> #include <stdlib.h>  int SaveNum(int n, int m) { 	if(n <= 0 || m <= 0) 	{ 		return -1; 	} 	 	struct{ 		int no; 		int next; 	}*a, t;  	int size = n * sizeof(t); 	a = malloc(size); 	if(a == NULL){ 		return -1; 	}  	int i, j, k, pos = 0; 	for(i = 0; i < n; ++i){ 		a[i].no = i + 1; 		a[i].next = (i + 1) % n; 	} 	 	for(i = n; i > 1; --i){ 		for(j = 0; j < m - 1; ++j){ 			if(j == m - 2){ 				a[pos].next = a[a[pos].next].next; 			} 			pos = a[pos].next; 		} 	} 	 	return a[pos].no; }  int main(void) { 	int n = 1, m = 1; 	 	while(n > 0 && m > 0){ 		printf("Please input the number of people(n) and the number to pick up(m):\n"); 		scanf("%d%d", &n, &m); 		printf("The number left is %d\n", SaveNum(n, m)); 	}  	return 0; }  Please input the number of people(n) and the number to pick up(m): 3 4 The number left is 2 Please input the number of people(n) and the number to pick up(m): 9 6 The number left is 7 Please input the number of people(n) and the number to pick up(m): 0 0 The number left is -1
user-0 提问: [憋尿坐等]vfork之后父进程的变量值变化的问题,跪求大佬解答

回复:
user: user-0
content: 谢谢,来之不易的回答!

user: user-1
content: vfork  后只能调用 exit， exec 系列函数， 其他都是未定义行为 ...           (From  POSIX.1)  The  vfork()  function  has  the  same effect as fork(2), except that the behavior is undefined if the process created by        vfork() either modifies any data other than a variable of type pid_t used to store the return value from  vfork(),  or  returns  from  the        function  in  which  vfork()  was called, or calls any other function before successfully calling _exit(2) or one of the exec(3) family of        functions.
user-0 提问:  学习数组指针遇到的问题.

回复:
user: user-1
content: px的类型是int (*)[2];而*px的类型是int *。可以看一下这篇关于指针的博客。 http://blog.csdn.net/sinat_26106275/article/details/46352785

user: user-2
content: int arr[16] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 }; int(*px)[2]; //赋值 px = (int(*)[2])arr; printf("%d %d\n",px,*px); //为什么px 与*px的地址值是一样的？ //如果想取数组arr第一个值 1，必须写成printf("%d \n",**px); ------------ 首先，px是一个指针，指向一个一维数组，该数组有2个元素，px每加1，就跳过一维数组所占用内存的长度 *px也是一个地址，与px具有相同的地址，只不过与px的类型不一样，px为 int(*)[2]，*px为int *，所以*px+1跳过一个int元素的长度 最后**px的类型就是int

user: user-3
content: 引用 3 楼 cfjtaishan 的回复: //为什么px 与*px的地址值是一样的？     //如果想取数组arr第一个值 1，必须写成printf("%d \n",**px); px和*px地址是一样的。因为二维数组的地址和第一行第一列的是一个位置，因此地址值一样。但是他们除了地址值一样的，其他是不一样的。比如类型不一样， px的类型是int (*)[2];而*px的类型是int *；由于类型不一样的，因此px + 1与 （*px)+1相对与px和*px的偏移也是不一样的。px + 1等价相对于px的位置向后便宜2 * sizeof(int)个字节； 而(*px)+1等价于向后便宜sizeof(int) px++等价与px = px + 1;

user: user-3
content: //为什么px 与*px的地址值是一样的？     //如果想取数组arr第一个值 1，必须写成printf("%d \n",**px); px和*px地址是一样的。因为二维数组的地址和第一行第一列的是一个位置，因此地址值一样。但是他们除了地址值一样的，其他是不一样的。比如类型不一样， px的类型是int (*)[2];而*px的类型是int *；由于类型不一样的，因此px + 1与 （*px)+1相对与px和*px的偏移也是不一样的。px + 1等价相对于px的位置向后便宜2 * sizeof(int)个字节； 而(*px)+1等价于向后便宜sizeof(int)

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

回复:
user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/360055953 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224 老师好，这个问题是我不用再开一个文件，只需要求出一个值就好。。

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:问一下对数字做什么操作？读，解析还是其他操作； 若是读，解析每个数字。可以考虑每次读一行，然后使用strtok_r解析，再调用atoi函数，最后可以把数字解析出来。 想把每行数字放在一个数组里，这里面的数字是user的编号，每一行第一个数是用户的编号，后面的数字是他的朋友，然后要算一下圈子，圈子是指他的朋友和朋友的朋友的序号的并集。。 然后我自己的想法是先放在数组里再将数组里的元素和别的数组比较，相同的就并到一起。。但是不知道能不能有效的解决问题

user: user-1
content: 问一下对数字做什么操作？读，解析还是其他操作； 若是读，解析每个数字。可以考虑每次读一行，然后使用strtok_r解析，再调用atoi函数，最后可以把数字解析出来。

user: user-2
content: http://bbs.csdn.net/topics/360055953 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224

user: user-0
content: 引用 2 楼 user-4 的回复:先读一行，找该行第一个空格，截取空格前部分，再找剩余部分空格，再截取空格..... 有没有具体点的代码呢？刚刚开始学C语言，不是很懂这方面的东西。。

user: user-3
content: 把文件读取到内存中，修改，然后重新写到文件

user: user-4
content: 先读一行，找该行第一个空格，截取空格前部分，再找剩余部分空格，再截取空格.....
user-0 提问: char[] + int  什么意思？？？求解！！！

回复:
user: user-1
content: 后面两个参数，第一个是接收缓存的地址，第二个是接收缓存还剩余的空间。 当第一次接收时，len = 0;那么接收缓存就是地址就是buffer+0,剩余空间sizeof(buffer)就是1024；若第一次接收了8个字节,即len = 8，那么下表从0~7的缓存已经占用了数据，下次接收到数据不能再放下表为0~7缓存里了，因此需要从buffer+8的位置接收。此时缓存的剩余的空间也需要sizeof(buffer)-len（此时len = 8);  代码没有贴全，后面的代码肯定有对len修改的。比如ret是此次接收到的数据长度（单位字节），因此后面应该有len += ret;类似的操作；

user: user-2
content: buffer+len = (char*)buffer + sizeof(T) * len //T为buffer的类型 即从buffer的首地址起，向前偏移len个sizeof(T)的距离，此时得到的依旧是一个指针地址 int *p = "abcde"; p + 3; *p; //p是字符串的首地址，*p即a，a所在的位置（地址）是 p+0，p+3即字符d所在的地址, *(p+3) == d

user: user-3
content: buffer表示数组buffer的起始地址，buffer+len表示数组起始地址的偏移，len的值随着read()会发生变化。

user: user-4
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-5
content: int ret = read(fd,buffer+len,sizeof(buffer)-len);  buffer+len 表示从数组的第buffer+len个位置继续写入 sizeof(buffer) -len 表示数组还可以写的数据长度 ret 返回写的长度

user: user-6
content: 这里的int起到偏移的作用，buffer+len表示从buffer起始位置加上len的长度位置开始存储数据， sizeof(buffer)-len表示接受1024 -len个字符的数据
user-0 提问: C

回复:
user: user-1
content: #include<stdio.h> int main() {     int a[10],*p,n=0;     printf("请输入10个整数:\n");     for(p=a;p<a+10;p++)         scanf("%d", p);     for(p--;p>=a;p--)         if(*p % 2 == 0)             n++;     printf("偶数的个数%d\n",n);     return 0; } 参考一下吧； 问题主要有3个： 第一个： scanf("%d", p);，应该用地址，即p而不是用*p,如果用*p，那么前面需要加&就是 scanf("%d", &(*p)); 第二个： if(*p % 2 == 0) 这个地方应该用*p，即应用指向的内存单元里的值；  第三个： for(p--;p>=a;p--) 通过上面输入的循环，p已经指向了数组后面的内存单元，可以理解位&a[10]，数组最后一个元素的地址是&a[9];所以先将p从&a[10]指向&a[9];就要先执行p-- 否则p指向的是越界的

user: user-2
content: scanf("%d",p);

user: user-1
content: 引用 5 楼 Camel_J 的回复:#include<stdio.h> int main() { 	int a[10],*p,n=0; 	 	printf("请输入10个整数:\n"); 	for( p = a ; p < a + 10 ; p++) 		scanf("%d",p); 	printf("*********\n"); 	for(p = p - 1; p > a; p--) 		if(*p % 2 == 0) 			n++; 	printf("偶数的个数%d\n",n); 	 	return 0; } 这个也是一样的，应该是p >= a; 因为数组名本身就是第一个元素的地址。

user: user-1
content: 引用 4 楼 Camel_J 的回复:指针的知识先弄明白吧。 改为以下：  #include<stdio.h> int main() { 	int a[10],*p,n=0; 	 	printf("请输入10个整数:\n"); 	for( p = a ; p < a + 10 ; p++) 		scanf("%d",p); 	for(p = a + 9 ; p > a; p--) 		if(*p % 2 == 0) 			n++; 	printf("偶数的个数%d\n",n); 	 	return 0; } 有问题哦，for(p = a + 9 ; p >= a; p--) 这儿应该是p >= a;否则数组中的第一个元素不会进入*p % 2 == 0的判断。

user: user-3
content: #include<stdio.h> int main() { 	int a[10],*p,n=0; 	 	printf("请输入10个整数:\n"); 	for( p = a ; p < a + 10 ; p++) 		scanf("%d",p); 	printf("*********\n"); 	for(p = p - 1; p > a; p--) 		if(*p % 2 == 0) 			n++; 	printf("偶数的个数%d\n",n); 	 	return 0; }

user: user-3
content: 指针的知识先弄明白吧。 改为以下：  #include<stdio.h> int main() { 	int a[10],*p,n=0; 	 	printf("请输入10个整数:\n"); 	for( p = a ; p < a + 10 ; p++) 		scanf("%d",p); 	for(p = a + 9 ; p > a; p--) 		if(*p % 2 == 0) 			n++; 	printf("偶数的个数%d\n",n); 	 	return 0; }

user: user-4
content: 引用 2 楼 cfjtaishan 的回复:#include<stdio.h> int main() {     int a[10],*p,n=0;     printf("请输入10个整数:\n");     for(p=a;p<a+10;p++)         scanf("%d", p);     for(p--;p>=a;p--)         if(*p % 2 == 0)             n++;     printf("偶数的个数%d\n",n);     return 0; } 参考一下吧； 问题主要有3个： 第一个： scanf("%d", p);，应该用地址，即p而不是用*p,如果用*p，那么前面需要加&就是 scanf("%d", &(*p)); 第二个： if(*p % 2 == 0) 这个地方应该用*p，即应用指向的内存单元里的值；  第三个： for(p--;p>=a;p--) 通过上面输入的循环，p已经指向了数组后面的内存单元，可以理解位&a[10]，数组最后一个元素的地址是&a[9];所以先将p从&a[10]指向&a[9];就要先执行p-- 否则p指向的是越界的回答的非常详细，作参考吧
user-0 提问: 数组给指向数组的指针赋值和给指向数组的指针赋值问题

回复:
user: user-0
content: 题目：将一个3×3的矩阵转置，用一函数实现之。在主函数中用scanf函数输入一下矩阵元素：在执行函数的过程中实现矩阵转置，函数调用结束后在主函数中枢出已转置的矩阵（用指针实现）。 一下是自己的代码 #include<stdio.h> int main() { 	void T(int *p); 	int a[3][3],i,j; 	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			scanf("%d",*(a+i)+j); 	T(*a); 	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			printf("%d", *(*(a+i)+j) ); }  void T(int *p) { 	int b[3][3],i,j; 	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			*(*(b+j)+i)=*(*(p+i)+j);  	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			*(*(p+i)+j)=b[i][j]; } 出现一下问题 *(*(b+j)+i)=*(*(p+i)+j); error C2100: illegal indirection *(*(p+i)+j)=b[i][j]; error C2100: illegal indirection和error C2106: '=' : left operand must be l-value 这是为什么呢，要怎么改正？

user: user-0
content: 指针变量p指向一个二维数组，b也是一个二维数组

user: user-1
content: 引用 4 楼 weixin_40519528 的回复:题目：将一个3×3的矩阵转置，用一函数实现之。在主函数中用scanf函数输入一下矩阵元素：在执行函数的过程中实现矩阵转置，函数调用结束后在主函数中枢出已转置的矩阵（用指针实现）。 一下是自己的代码 #include<stdio.h> int main() { 	void T(int *p); 	int a[3][3],i,j; 	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			scanf("%d",*(a+i)+j); 	T(*a); 	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			printf("%d", *(*(a+i)+j) ); }  void T(int *p) { 	int b[3][3],i,j; 	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			*(*(b+j)+i)=*(*(p+i)+j);  	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			*(*(p+i)+j)=b[i][j]; } 出现一下问题 *(*(b+j)+i)=*(*(p+i)+j); error C2100: illegal indirection *(*(p+i)+j)=b[i][j]; error C2100: illegal indirection和error C2106: '=' : left operand must be l-value 这是为什么呢，要怎么改正？ p不是指向一个二维数组哦，而是一个一维数组。 可以改一下形参，如下：  #include<stdio.h>  void T(int (*p)[3]); int main() { 	int a[3][3],i,j; 	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			scanf("%d",*(a+i)+j); 	T(a); 	for(i=0;i<3;i++) { 		for(j=0;j<3;j++) 			printf("%d ", *(*(a+i)+j) ); 		putchar(10); 	} }  void T(int (*p)[3]) { 	int b[3][3],i,j; 	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			*(*(b+j)+i)=*(*(p+i)+j);  	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			*(*(p+i)+j)=b[i][j]; } 参考一下吧

user: user-2
content: p是int*，不是二维数组。

user: user-1
content: 信息提供的不足，p指向的是一个什么样的数组，二维数组，还是什么？ 建议提供更多的信息；

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

回复:
user: user-0
content: #include <stdio.h> int main() {     int i,c[100],n;     while(scanf("%d",&c[0])!=EOF)     {         char ch='0';         for(i=1;ch!='\n'&&ch != EOF;i++)         {             scanf("%d",&c[i]);             ch=getchar();         }         n=i;           int Max=c[0],cMax=c[1],temp;         if(cMax>Max)         {             temp=cMax;             cMax=Max;             Max=temp;         }         for(i=0;i<n;i++)         {             if(c[i]>Max)             {                 cMax=Max;                 Max=c[i];             }             if(c[i]>cMax&&c[i]<Max)             {                 cMax=c[i];             }         }         printf("%d %d\n",Max,cMax);         if(ch == EOF)             break;     }     return 0; }

user: user-0
content: 应该是题目问题，老师告诉判断结束的条件了

user: user-1
content: 头文件algorithm.h里的sort直接两三行就搞定了。

user: user-2
content: 你的问题和这个帖子是类似的，建议参考一下； http://bbs.csdn.net/topics/392300411

user: user-2
content: int first_idx, second_idx; void get_max12(int*a, int n) {     int first_max, second_max;     int i, j;     first_max = a[0];     first_idx = 0;       for (i = 1; i < n; i++) {         if (first_max < a[i]) {             second_max = first_max;             second_idx = first_idx;             first_max = a[i];             first_idx = i;             break;         } else if (first_max > a[i]){             second_max = a[i];             second_idx = i;             break;         }     }       //printf("%d %d", first_idx, second_idx);       for (j = i + 1; j < n; j++) {         if (first_max < a[j]) {             second_max = first_max;             second_idx = first_idx;             first_max = a[j];             first_idx = j;             //printf("+++%d %d", first_idx, second_idx);         } else if (first_max != a[j] && second_max < a[j])         {             //printf("---%d %d", first_idx, second_idx);             second_max = a[j];             second_idx = j;         }     } 参考一下吧，first_idx和second_idx分别是最大值和次最大值的下表；并且定义了全局变量。

user: user-3
content: 同意1楼， 因为题目没有要求所有输入数据按一定顺序输出，所以遍历就可以。 如果要排序，推荐快速排序或者堆排序。

user: user-4
content: 不用排序，你直接定义一个Smax和Rmax 然后遍历一遍数组，每次大于Smax的就覆盖Smax， 小于Smax但大于Rmax的，就覆盖Rmax
user-0 提问: 新人  求解 

回复:
user: user-0
content: 第一个题我会  想发第二个题的  不小心把第一个题也发出来了        我不太明白怎么在指定条件下输出‘？’               这是我写的第一个题    #include<stdio.h> main() { 	int i,j,q,b,c,n; 	int a[6][6]; 	printf("输入限定条件 n(1<n<=6)\n"); 	scanf("%d",&n); 	printf("请给数组赋值：\n"); 	for(i=0;i<n;i++) 		for(j=0;j<n;j++) scanf("%d",&a[i][j]); 	printf("原样输出数组：\n"); 	for(i=0;i<n;i++) 	{ 		for(j=0;j<n;j++) printf("%d ",a[i][j]); 		printf("\n"); 	} 	for(i=0;i<n;i++) 	{ 		b=a[i][0]; 		for(j=0;j<n;j++) 		{ 			if(b<a[i][j]) 			{ 				b=a[i][j]; 				c=j; 			} 		} 		for(q=0;q<n;q++) 		{ 			if(a[q][c]<b) break; 			if(q==n-1) printf("鞍点为：%d    a[%d][%d]\n",b,i,c);break; 		} 	} 	if(q!=n-1) printf("none\n"); }

user: user-1
content: 第一题   #include<iostream> using namespace std;  int main() { 	int flag = 0; 	int min = 9999999; 	int x = 0; 	int y = 0; 	int max = 0; 	int mat[6][6]; 	int num; 	cin >> num; 	for (int i = 0; i < num; i++) 	{ 		for (int j = 0; j < num; j++) 		{ 			cin >> mat[i][j]; 		} 	} 	for (int i = 0; i < num; i++) 	{ 		x = 0;  		y = 0; 		min = 9999999; 		max = 0; 		for (int j = 0; j < num; j++) 		{ 			if (mat[i][j]>max) 			{ 				max = mat[i][j]; 				y = j; 			} 		} 		for (int k = 0; k < num; k++) 		{ 			if (mat[k][y] < min) 			{ 				min = mat[k][y]; 				x = k; 			} 		} 		if (x == i) 		{ 			printf("%d %d", x, y); 			flag = 1; 			break; 		} 	} 	if (!flag) printf("NONE"); 	return 0; }   如果是想学习的话，最好是自己先尝试，不懂再问，这样进步才会快

user: user-2
content: 建议自己先写写，调试一下；若遇到问题，可以提出来。写程序需要沉下心来，通过自己学到的知识点来解决这些问题。平时也应该多看课本和别人的成熟程序，自己也应该多练习。不要遇到问题了，再临时抱佛脚。
user-0 提问: 动态内存分配？

回复:
user: user-0
content: 引用 4 楼 paschen 的回复:pa = &a; 已经改变了pa的值了，pa已经指向了另一块内存，而不是你申请的，释放这块不是动态申请的内存将导致出错。如果你是要拷贝字符串，应该用strcpy，直接赋值只是改变指针的指向 明白了，非常感谢！

user: user-0
content: 引用 2 楼 hdt 的回复:用strcpy，代替 p=&a; p=a 改变了p的指向。再free p 其实free的a  非常感谢！我按你意思改了一下！可以正常运行！ #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(void) {	 	char *pa = (char*)malloc(100); 	char a[] = {"hello world!"}; 	char b[] = {"hello computer!"}; 	if(!pa) 	{ 		printf("error!"); 		return; 	} 	strcpy(pa,a); 	printf("%s\n",pa); 	free(pa); 	pa = NULL; 	printf("%s\n",pa); 	return 0; }

user: user-1
content: pa = &a; 已经改变了pa的值了，pa已经指向了另一块内存，而不是你申请的，释放这块不是动态申请的内存将导致出错。如果你是要拷贝字符串，应该用strcpy，直接赋值只是改变指针的指向

user: user-0
content: 找到了一些细节 我将free(pa);写到pa = NULL;的上后面，也就是将pa先指向空，再将pa释放。这样的话运行后就正常了。得到结果 holle world! <NULL>  那么我应该是错在，释放正在使用的内存。是不是这样？ 也就是当pa指向a的地址还在使用时，是free不掉的。只有将pa指向空地址后，才可以free释放内存。  这是我的理解，是不是这样？请大神指教！谢谢！

user: user-2
content: 用strcpy，代替 p=&a; p=a 改变了p的指向。再free p 其实free的a

user: user-0
content: 当我将free(pa);这句删掉后，运行结果为：   为什么free(pa);释放语句不能加？

user: user-3
content: 楼上的人都说出答案了！！就是pa指向被改变了！我就来混点分！
user-0 提问: C程序运行偶尔有异常

回复:
user: user-0
content: 引用 1 楼 jianwen0529 的回复:unsigned char *outData=new unsigned char[strLen + 1];//多分配一个字节，用于存储字符串结束符 '\0' //... outData[strLen] = '\0'; int TwoLen=strlen((char *)outData)-1; //strlen长度是依靠字符串结束符 '0'判断的   谢谢兄弟，我是用指针最后放的 '\0'，问题确实是在数组的长度上，outData是存放二进制数据的，数字的长度要在原始数据的长度上*8， 忘了*8了。不过还是谢谢大兄弟~！

user: user-1
content: unsigned char *outData=new unsigned char[strLen + 1];//多分配一个字节，用于存储字符串结束符 '\0' //... outData[strLen] = '\0'; int TwoLen=strlen((char *)outData)-1; //strlen长度是依靠字符串结束符 '0'判断的