Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 有趣的指针—指针的高级应用

回复:
user: user-1
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源文件可以调用.c源文件作为头文件吗？可否有简单的例程咧

回复:
user: user-1
content: 引用 2 楼 喔喔喔喔喔喔喔喔的回复:这样的话，我可以在linux下通过makefile进行处理，屏蔽掉该源文件的生成，但是在windows下应该如何处理该情况呢？ 可以把.c文件名改为.h，然后主.c里面include这个.c；我们项目就是这么干。这种方法一般是，这个.c有宏开关，宏开关在不同的.c定义，这样不同的.c文件include这个.h就可以有多种实现。用起来很灵活

user: user-0
content: 这样的话，我可以在linux下通过makefile进行处理，屏蔽掉该源文件的生成，但是在windows下应该如何处理该情况呢？

user: user-2
content: 语法上可以 原则上不这样做 如果使用IDE .c文件是默认会编译的 单独的.c编译一次 include到另一个.c文件之后 重新编译一次   这个文件里面的实体会出现重复定义的情况
user-0 提问: 哪位大神能帮我修改一下，加个一段程序，使代码也可以输出char？

回复:
user: user-1
content: int main() {      double f;     long n;     int		nums;     char	c;      printf("pls enter ur double:");      nums = scanf("%lf", &f);     if (nums == 1)     {         if (f < 0)         {             printf("-");             f = -f;         }         n = (long)f;//整数部分         printf("is:", NUM);         integer(n);         printf(".");         decimal(f - n);//小数部分的转换     } 	else 	{ 		scanf("%c", &c); 		printf("%c: ", c); 		integer(c); 	}     printf("\n");     system("pause");     return 0; }

user: user-0
content: 就是输入一个值比如说输入5.88或者C或者6这几个类型的值以二进制的形式输出，我想找个大神帮我修改一下这段代码，这个只能输出小数和整数的二进制的值

user: user-2
content: 想帮你，不过你可以把问题叙述得完整一点吗。。。

user: user-0
content: 没有人来帮忙吗。。

user: user-0
content: 来人啊，来人啊

user: user-0
content: 有没有人啊！！！
user-0 提问: 小弟遇到c语言问题了求大神解答

回复:
user: user-0
content: 引用 1 楼 自信男孩 的回复:scanf_s("%s", x, strlen(x)); 第三个参数应该用：LEVEL_MAX * 2 - 1 谢谢大神啊，问题解决了，问题我猜是scanf_s需要的参数里的，恶补一下这个再回来问大神吧，康萨阿米达！

user: user-1
content: scanf_s("%s", x, strlen(x)); 第三个参数应该用：LEVEL_MAX * 2 - 1
user-0 提问: C语言结构体所占用的字节数如何计算？？？

回复:
user: user-1
content: 可以了解一下结构体内存对齐和#pragma pack

user: user-2
content: 可以关闭对齐（对齐到1字节）

user: user-3
content: 32位系统上：4+10+1+1(补齐) + 4 + 4 = 24  共补了一个字节 如果是16位系统：2 + 10 + 1 + 1(补齐) + 2 + 2 = 18 共补了一个字节，应该不会是19，因为结构体对其也是系统的整数倍（32位系统，需要是4的倍数，16位系统，需要是2的倍数）  以上的推测背景是Linux系统

user: user-4
content: 仅供参考：#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("AD sizeof %d\n", sizeof(AD));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("A1 sizeof %d\n", sizeof(A1));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("A2 sizeof %d\n", sizeof(A2));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("A4 sizeof %d\n", sizeof(A4));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("A8 sizeof %d\n", sizeof(A8));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("A16 sizeof %d\n", sizeof(A16));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 //AD sizeof 32 // //A1.a 0 //A1.b 4 //A1.c 17 //A1 sizeof 25 // //A2.a 0 //A2.b 4 //A2.c 18 //A2 sizeof 26 // //A4.a 0 //A4.b 4 //A4.c 20 //A4 sizeof 28 // //A8.a 0 //A8.b 4 //A8.c 24 //A8 sizeof 32 // //A16.a 0 //A16.b 4 //A16.c 24 //A16 sizeof 32 // //

user: user-5
content: 需要考虑对齐要求alignment requirement

user: user-6
content: 没有统一有效的算法 都是按照具体编译环境处理的 只保证一定可以存下所有成员
user-0 提问: 有关epoll+socket的问题

回复:
user: user-1
content: 引用 楼主 Nelg的回复:首先一些基本的socket问题 1.若一个socket设置成非阻塞socket，那么调用accept()函数的时候，socket是阻塞还是非阻塞状态？ 2.若使用select或者epoll，那么socket还要设置成非阻塞式吗？ 3.若socket是阻塞式的，并且使用一个线程去accept()新的客户端，那么在accept()的期间是不是另一个线程去接收或者发送已连接的客户端的数据也会在阻塞状态？ 4.还是不是很清楚epoll的用法，网上的资料千篇一律，希望能得到一个epoll+socket的原理和流程描述 1. accept是否阻塞由socket决定的，这个你可以写代码试一试 。2. 使用epoll并不要求socket是非阻塞的，但一般都建议是非阻塞的，因为socket阻塞的话可能导致epoll_wait不能及时返回，处理新的请求。3. 不会，因为是不同的socket。
user-0 提问: 一个简单的链表编写到一半的时候编译通过但是运行出错，请大神帮忙看看问题出在哪里，谢谢啦！

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

user: user-2
content: void insert(Linklist L,Datatype x) {     Linklist S=(Linklist)malloc(sizeof(ListNode));     if(S==NULL)     {         printf("申请空间失败！\n");         return;     }     S->data = x;  #if 1     S->next = L->next;     S->front = L;     L->next = S; #else      S->next = L->next;     L->next = S;     S->front=L;     S->next->front=S; #endif     return; }  参考一下吧

user: user-0
content: 引用 1 楼 冷风1023 的回复:S->data=x;     S->next=L->next; //这里L->next初始化的时候是NULL，所以S->next就是NULL     L->next=S;     S->front=L;     S->next->front=S;//根据上面的值S->next是NULL，所以这里段错就肯定的了。 对了！这里好像是有点问题，我再去改改，谢谢啦兄弟。一会有问题的话回来问问

user: user-3
content: S->data=x;     S->next=L->next; //这里L->next初始化的时候是NULL，所以S->next就是NULL     L->next=S;     S->front=L;     S->next->front=S;//根据上面的值S->next是NULL，所以这里段错就肯定的了。
user-0 提问: 系统报错systax error：'；'

回复:
user: user-1
content: 分号是中文的。应该换成英文的。按Shift键即可切换到英文模式。

user: user-2
content: int expenses(stacknode *p, int x1, int x2, int x3, int x4) {     int w;      if(x3!= 0) {         if(weather()==1)             w = (x1*24+x2+1-(p->data.time.day*24+p->data.time.hour))*price_1;      //天气不同，价格不同         else if(weather()==2)             w = (x1*24+x2+1-(p->data.time.day*24+p->data.time.hour))*price_2;         else             w = (x1*24+x2+1-(p->data.time.day*24+p->data.time.hour))*price_3;     } else {         if(weather()==1)             w = (x1*24+x2+1-(p->data.time.day*24+p->data.time.hour))*price_1;      //天气不同，价格不同         else if(weather()==2)             w = (x1*24+x2+1-(p->data.time.day*24+p->data.time.hour))*price_2;         else             w = (x1*24+x2+1-(p->data.time.day*24+p->data.time.hour))*price_3;     }      return w;  } 建议加上括号。另外，看不出有其他的问题。建议将所有代码都贴出来。 尤其是stacknode的定义
user-0 提问: 关于insert 语法的问题

回复:
user: user-1
content: 哥们，同样的错误已经犯过一次了，为什么还来问。。。 https://bbs.csdn.net/topics/392495425

user: user-0
content: INSERT INTO table  (req_no,rcv_no)  VALUES(:aa.req_no[100],:null_aa.req_no[100]);  这样传喽

user: user-2
content: aa和null_aa都是结构体变量，而不是结构体数组吧。你传进去的参数aa[100], null_aa[100]应该是不对的。
user-0 提问: 请各位大佬看看这是啥意思啊？特别急，求助

回复:
user: user-1
content: System.ArgumentNullException: 值不能为 null。参数名: path1   在 System.IO.Path.Combine(String path1, String path2)     这个是C#代码， Path.Combine 是合并两个路径信息，其中一个参数是null
user-0 提问: C语言里一个无符号char型数，左移9位会怎么样？

回复:
user: user-1
content: 你是把2左移9位，给一个整数了，和以前的uc无关

user: user-2
content: 将ui的类型也定义为无符号的字符型就能得到你预想的结果

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

user: user-4
content: 在移位之前，编译器会先对ui进行类型提升，提升为int。

user: user-5
content: 和CPU的操作寄存器最小容量有关。

user: user-6
content: 引用 8 楼 user-7 的回复:[quote=引用 3 楼 独孤由过 的回复:] 左移之后把值再保存至uc中，此时溢出，结果为0  [/code]为什么要保存到uc中?[/quote] 前面以寄存器说明左移原理，解释所谓的提升类型 用ui和uc做对比，两个变量空间大小不一样，一个未溢出，一个溢出 这是针对你提出的问题

user: user-7
content: 引用 3 楼 独孤由过 的回复:左移之后把值再保存至uc中，此时溢出，结果为0  [/code]为什么要保存到uc中?

user: user-6
content: 确实会进行类型提升，当使用unsigned long long时，使用两个寄存器，unsigned int只需用一个寄存器

user: user-6
content: 首先从uc中取出值，存放于寄存器，之后再进行左移，x86寄存器一般32位，此时不会溢出 左移之后把值保存至ui中，此时也不会溢出，结果为1024 左移之后把值再保存至uc中，此时溢出，结果为0  #include <stdio.h>  int main() { 	unsigned char uc = 2; 	unsigned int ui = uc << 9; 	printf("%u\n", ui); 	printf("%u", uc <<= 9); 	return 0; }

user: user-7
content: 类型提升 和 一个int 左移9一样
user-0 提问: linux多线程为什么只执行一次

回复:
user: user-1
content: #include <stdio.h> #include <unistd.h> #include <pthread.h> int flag = 1; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void *fun1(void *param) {         while(flag)         {                 pthread_mutex_lock(&mutex);                 printf("fun1\n");                 pthread_mutex_unlock(&mutex);                 usleep(2);         } }  void *fun2(void *param) {         while(flag)         {                 pthread_mutex_lock(&mutex);                 printf("fun2\n");                 pthread_mutex_unlock(&mutex);                 usleep(2);         } }  int main() {         pthread_t t1,t2;         pthread_create(&t1,NULL,fun1,NULL);         pthread_create(&t2,NULL,fun2,NULL);         usleep(20);         flag = 0;         pthread_join(t1,NULL);         pthread_join(t2,NULL);         return 0; } 在Linux下你的程序编译不通过，以上是修改之后的可以编译通过的代码；  之所以只执行一次，是因为usleep(20);时间太短。因为一个printf打印就基本上消耗远大于20us了。所以，只打印一次是正常的。
user-0 提问: C语言ELF加载和监控难题！

回复:
user: user-1
content: 参考源代码就可以了呀多看看

user: user-0
content: 引用 3 楼 赵4老师 的回复:参考linux源代码中ldd命令对应源代码相关片段。能不能具体说下……

user: user-2
content: 参考linux源代码中ldd命令对应源代码相关片段。

user: user-0
content: 哪位大神帮我实现void loader(char *filename) 方法！必有重谢！！！

user: user-0
content: 能不能具体点说说该怎么写，附上代码
user-0 提问: 关于c语言指针的初始化问题

回复:
user: user-1
content: 不一定是NULL，很大概率是非NULL。因为msg定义的指针没有初始化，那么这个指针变量里存放的内容是随机值，即指向是随机的。因此不一定为NULL，很大可能不是NULL。建议可以用%p打印一下，因为是随机值，每次运行的结果可能不一样。

user: user-0
content: 引用 1 楼 自信男孩 的回复:不一定是NULL，很大概率是非NULL。因为msg定义的指针没有初始化，那么这个指针变量里存放的内容是随机值，即指向是随机的。因此不一定为NULL，很大可能不是NULL。建议可以用%p打印一下，因为是随机值，每次运行的结果可能不一样。    引用 2 楼 北纬22.5度的攻城狮 的回复:msg的值是随机的，与当时系统的内存使用有关，如果刚好p的地址位于一个已使用过的空间，那它就不是NULL  谢谢二位！

user: user-2
content: msg的值是随机的，与当时系统的内存使用有关，如果刚好p的地址位于一个已使用过的空间，那它就不是NULL
user-0 提问: 无符号乘法和补码乘法

回复:
user: user-1
content: 楼上错了吧，x=-2 ux=2^N - 2 也就是说如果x为负数，ux=2^N+x，如果x为正数，ux=x 分为三种情况： 两个正数、一正一负、两个负数  结论应该是对的

user: user-2
content: 这个不一定相等吧，unsigned 默认是unsigned int即无符号整型，而int是有符号整型，比如x=-2  y=3  ux=2  uy=3，等式就不成立
user-0 提问: socket问题

回复:
user: user-1
content: fd 是linux下的文件描述符，可以理解为windows下的句柄 FD_READ 可以理解为系统通过这个文件描述符找到你要读的是什么(socket、io、文件等等)，FD_WRITE同理

user: user-2
content: struct  socket{    IP;   PORT;   TYPE;   ..... }  *fd, socket;  fd = &socket;  用于指向描述这个socket的指针，可以这样理解。

user: user-0
content: 且当File Descriptor 吧

user: user-3
content: 关于FD_WRITE、FD_READ专栏： https://blog.csdn.net/geeeeeeee/article/details/6559636

user: user-4
content: 文件描述符吧：File Descriptor

user: user-5
content: 引用 5 楼 北纬22.5度的攻城狮的回复:一般而言，fd指的是 file descriptor，即文件描述符；fp指的是file pointer，即文件指针。两者常被用于操作文件 一般fd是int类型，fp是FILE *类型

user: user-5
content: 一般而言，fd指的是 file descriptor，即文件描述符；fp指的是file pointer，即文件指针。两者常被用于操作文件

user: user-6
content: 这里的FD指的应该是file descriptor。

user: user-7
content: 文件描述符的意思 File Descriptor 在 linux 里, 一切都是文件,  应用程序和系统内核之间交流的时候用文件描述符来指定要操作的文件.

user: user-8
content: 前面的这种缩写一般没有规范，只是取几个代表性字母，估计你得找官方代码或许才能知道什么意思。
user-0 提问: QT问题：为什么不能使用QString？

回复:
user: user-0
content: 哈哈，谢谢1楼

user: user-1
content: 试试   QString path= QFileDialog::getOpenFileName(this,"Open","D:/","*");  //后面的判断改为： 0 == path.size()

user: user-2
content: nameS 看后面红字
user-0 提问: 大佬帮我看一下为什么不能把文件的信息传到链表里去

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

user: user-2
content: 我觉得没什么大问题

user: user-3
content: 楼主的代码除了fclose和return位置错了以外，没什么大毛病，把你的问题描述的再清楚点，太模糊了。

user: user-4
content: 引用 6 楼 @风轻云淡_ 的回复:[quote=引用 5 楼 自信男孩 的回复:] 应该和打开的方式没有关系，主要是楼主的文件是fwrite写进去的吗？因为fwrite/fread是一对的，用什么方式写的就用什么方式读，这个是需要注意的。  另外，有两处需要注意：    return head;     fclose(fp); 这两条语句需要交换一下顺序，即先fclose，在return；因为如果按照你的方式去执行，那么fclose永远不会执行啊。   if(fread(s,LEN,1,fp)==0)             break; 这个地方是否需要改一下呢，改成：   if(fread(s,LEN,1,fp) < LEN)             break; 因为fread返回值是LEN * 1的长度，否则要么是读取失败，要么就是读到文件末尾我又自己测试了下，确实和加不加b没有关系，只要是fwrite写进去的，不加b也能fread出来。那个fread的返回值是读取成功结构体的个数，并不是读取到的字节。读取不到返回0，我测过了，你自己试试。[/quote] 恩，可能fread的返回值是1对应的值，即 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); On  success,  fread()  and  fwrite() return the number of items read or written.  This number equals the number of bytes transferred only when size is 1.  If an error occurs, or the end of the        file is reached, the return value is a short item count (or zero).

user: user-3
content: 引用 5 楼 自信男孩 的回复:应该和打开的方式没有关系，主要是楼主的文件是fwrite写进去的吗？因为fwrite/fread是一对的，用什么方式写的就用什么方式读，这个是需要注意的。  另外，有两处需要注意：    return head;     fclose(fp); 这两条语句需要交换一下顺序，即先fclose，在return；因为如果按照你的方式去执行，那么fclose永远不会执行啊。   if(fread(s,LEN,1,fp)==0)             break; 这个地方是否需要改一下呢，改成：   if(fread(s,LEN,1,fp) < LEN)             break; 因为fread返回值是LEN * 1的长度，否则要么是读取失败，要么就是读到文件末尾我又自己测试了下，确实和加不加b没有关系，只要是fwrite写进去的，不加b也能fread出来。那个fread的返回值是读取成功结构体的个数，并不是读取到的字节。读取不到返回0，我测过了，你自己试试。

user: user-4
content: 应该和打开的方式没有关系，主要是楼主的文件是fwrite写进去的吗？因为fwrite/fread是一对的，用什么方式写的就用什么方式读，这个是需要注意的。  另外，有两处需要注意：    return head;     fclose(fp); 这两条语句需要交换一下顺序，即先fclose，在return；因为如果按照你的方式去执行，那么fclose永远不会执行啊。   if(fread(s,LEN,1,fp)==0)             break; 这个地方是否需要改一下呢，改成：   if(fread(s,LEN,1,fp) < LEN)             break; 因为fread返回值是LEN * 1的长度，否则要么是读取失败，要么就是读到文件末尾

user: user-3
content: 你既然以这种方式读取 if(fread(s,LEN,1,fp)==0) ，那么文件打开方式要选择 "rb"  if((fp=fopen("E:\\CourseDesign.txt","rb"))==NULL)

user: user-1
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-0
content: 麻烦能给我一个详细的代码过程可以吗 初学文件卡在这里了
user-0 提问: 求问c语言快排实现top k问题，感觉逻辑性没问题，但总是发生溢出，求各位大神看看

回复:
user: user-1
content: 会调试这些都不是问题，看下溢出时low high值就知道了 80%的递归问题都是跳出递归条件判断错误或者不充分

user: user-2
content: 正好这里有一个蓝桥杯大赛题  标题：快速排序。  以下代码可以从数组a[]中找出第k小的元素。 它使用了类似快速排序中的分治算法，期望时间复杂度是O(N)的。 请仔细阅读分析源码，填写划线部分缺失的内容。  #include <stdio.h>  int quick_select(int a[], int l, int r, int k) { 	int p = rand() % (r - l + 1) + l; 	int x = a[p]; 	{int t = a[p]; a[p] = a[r]; a[r] = t;} 	int i = l, j = r; 	while(i < j) { 		while(i < j && a[i] < x) i++; 		if(i < j) { 			a[j] = a[i]; 			j--; 		} 		while(i < j && a[j] > x) j--; 		if(i < j) { 			a[i] = a[j]; 			i++; 		} 	} 	a[i] = x; 	p = i; 	if(i - l + 1 == k) return a[i]; 	if(i - l + 1 < k) return quick_select(a, i + 1, r, k - p - 1); //填空 	else return quick_select(a, l, i - 1, k); } 	 int main() { 	int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12}; 	printf("%d\n", quick_select(a, 0, 14, 5)); 	return 0; }

user: user-3
content: 这程序会跑到宇宙之外吧~

user: user-4
content: 如果溢出，建议在top_k函数内把low和high的值都打印出来看一下。

user: user-4
content: 引用 3 楼 _ZGq 的回复:你没有srand()，所以rand()的结果是1。 如果想要随机值，可以先包括<time.h>，再在main函数开头写一次 srand(time(NULL)); 。 既然是rand();那么结果为啥确定是1呢？如果能确定是1，这个函数为啥还叫随机生成数函数呢？  如果没有srand()，那么这10个数可能是一个相同的数。

user: user-5
content: 你没有srand()，所以rand()的结果是1。 如果想要随机值，可以先包括<time.h>，再在main函数开头写一次 srand(time(NULL)); 。

user: user-6
content: 溢出是因为一直在递归调用。你的递归结束条件可能永远不满足。不妨把中间调用过程打印出来仔细分析。

user: user-7
content: top k 堆排序才是原罪
user-0 提问: C语言

回复:
user: user-1
content: 没有初始化，那么数组内的元素都是随机值，这样就不好判定它是否为空。要判断其是否为空，建议初始化一下数组，一般初始化都是为0.

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

user: user-3
content: VS2015 C++代码  0x007CFA6C是data的起始地址，可以看到初始值都是0xCC

user: user-4
content: 无法判断，请给出你的具体使用环境。局部变量未初始化时为随机值。

user: user-5
content: data[i][j][0] == '\0'
user-0 提问: 编程问题求助，求一下程序的输出结果，并分析。

回复:
user: user-0
content: [quote=引用 2 楼 user-3 的回复:] [quote=引用 1 楼 user-3 的回复:]  程序1问题： *p3=(char*)malloc(num）改为*p3=malloc(num）是否可行？ 修改程序后编译通过并且正常显示hello,且malloc函数本身返回的就是地址，加不加（char*）都一样？  程序2问题： free（str4）；//不太懂这句，释放内存后里面的内容不会清除么？？？

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

user: user-2
content: 两个程序都能正常输出结果“hello", "world".  因为str3， str4虽然初始化为NULL，但是都通过malloc申请了空间，并把新的空间存放到了str3, str4中（而已理解新的地址值覆盖了NULL)。  两个程序都有一个共同的问题，就是释放内存，malloc需要手动释放，因此需要在用完之后free掉。

user: user-3
content: 引用 1 楼 user-3 的回复:程序1：GetMemory3函数能够申请内存并通过第一个参数p3返回分配的内存地址。 在Test3中，首先调用GetMemory3, 为str3指针分配100字节的内存，然后利用strcpy 向该块内存赋值字符串， strcpy会同时复制字符串结束符，所以复制结束后，str3就是 一个字符串，内容为"hello"  hello   程序2：分析请你仿照程序1的分析自己写  world    估计写出结果不难，难的是分析结果？ 抱歉是“复制字符串”，不是“赋值字符串”。 拼音输入的。

user: user-3
content: 程序1：GetMemory3函数能够申请内存并通过第一个参数p3返回分配的内存地址。 在Test3中，首先调用GetMemory3, 为str3指针分配100字节的内存，然后利用strcpy 向该块内存赋值字符串， strcpy会同时复制字符串结束符，所以复制结束后，str3就是 一个字符串，内容为"hello"  hello   程序2：分析请你仿照程序1的分析自己写  world    估计写出结果不难，难的是分析结果？
user-0 提问: 求助一下，用C语言求蒲丰（buffon）投针问题

回复:
user: user-1
content: 除了上面说的问题之外，还有一处，Get函数里distance应该取(A+1)/2的模

user: user-2
content: 你的A代表的是平行线之间的距离，distance是针的中心点到最近那条平行线的垂直距离，这个值应该是在0到A/2之间的，而你是在0到L之间随机的。。（你这里A和L的值一样）所以相当于你是用了两倍的A来计算的，所以你的结果是约等于 1/pai.

user: user-3
content: 如果是两倍关系，那把结果×2不就行了吗？ 如果不是，那可以检查一下公式看有没有问题。

user: user-0
content: 引用 1 楼 user-3 的回复:原因：GetP函数无法改变主函数中p的值。 修改方法：把主函数中float p=0;和GetP(n);删掉，把输出中的p换成GetP(n)。  谢谢！修改之后能输出了，但是输出的结果一直为0.3几，结果应该输出0.6几的，能找到原因吗

user: user-3
content: 原因：GetP函数无法改变主函数中p的值。 修改方法：把主函数中float p=0;和GetP(n);删掉，把输出中的p换成GetP(n)。
user-0 提问: Linux编程 知道线程id怎么获取线程信息

回复:
user: user-1
content: 要么知难而退，要么知难而进。

user: user-2
content: 其实linux线程是用进程模仿的，而每个pid对应一个记录状态的文件 把以下${pid}换成pid值 cat /proc/${pid}/status 查看最大线程数： cat /proc/sys/kernel/threads-max
user-0 提问: source insight宏定义函数名显示问题

回复:
user: user-1
content: source insight没这个本事。建议不要玩弄这样的宏技巧。

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

user: user-3
content: Source Insigh目录，其中有一个C.tom文件。修改该文件，在其中增加一行： FUNC_DECL 试试
user-0 提问: 在vc++6.0到底能不能自定义函数调用main函数?

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

user: user-2
content: 那样就循环了

user: user-3
content: 实践是检验真理的唯一标准！

user: user-4
content: 除非你想递归调用？

user: user-5
content: 引用 1 楼 user-6 的回复:请问子函数调用主函数有啥意义？最终不就是栈溢出和递归类似的做一个出口就不会了

user: user-5
content: 可以 没必要

user: user-6
content: 请问子函数调用主函数有啥意义？最终不就是栈溢出
user-0 提问: 数据结构C语言版，求大神帮忙解答！

回复:
user: user-1
content: 这是作业贴吧，还是自己先写出来，有问题把代码贴出来吧

user: user-2
content: 你发错版块了， 让版主帮你转到 C语言版块去吧

user: user-3
content: 感觉你放在这还不如自己百度来得快。论坛的意义就是碰到自己解决不了的，贴出来，仁者见仁智者见智，讨论之后选出最佳方案，最终解决自己的问题，从而印象深刻，下次碰到类似的问题可以自己解决。你这把作业题直接贴上来，代码一个子没有，这种习惯最好改改。
user-0 提问: C语言删除文件中记录的问题-救命！！

回复:
user: user-1
content: 贴出自己的代码吧，这样描述没有代码具体

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

user: user-3
content: 建议你换一个思路：普通的增删改查不要以文件为媒介，可以在内存中创建一个保存数据的结构（一般以链表居多）。然后程序启动之前，将数据全部读出，增删改查进行完之后，程序退出之前将结构中数据保存到文本文件。读取保存方式要一致，建议直接以二进制方式写入，以二进制方式读出。
user-0 提问: 第二次删除文件记录失败，为什么？

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

user: user-2
content: 全部数据记录在一个文件？这个文件的内容介绍下，对文件操作的代码贴下，你这样描述，很多人其实不知道你在说什么，

user: user-3
content: 我写的就是课程信息管理系统，我写的没有错误

user: user-4
content: 引用 2 楼 weixin_40078613 的回复:[quote=引用 1 楼 qq_21563855 的回复:] 不可能吧，我也是用你的方法做的，没有错误 和同学都是这样，我写的学生信息管理系统（有显示学生记录，删除学生记录等）。运行程序，如果第一个操作就是删除学生信息，就能成功删除指定学号的记录，但是再回到主菜单，继续执行删除学生记录，就不行了，没有提示。但写将不删除的记录写入备份文件stubak.dat成功，再删除原文件remove("student.dat")，在文件夹里也看到删除成功，再改名rename("stubak.dat","student.dat")也成功。可就是回到主菜单，显示学生记录，只删除了前一次操作的记录，第二次执行删除操作的记录还在里面。函数执行完都fclose()了，也测试过，关闭成功了。真是纠结。如果我运行程序，第一次是执行的显示学生记录的操作showInfomation()，再执行删除记录操作delRecord()，一样删不掉。各位大神，救命！！[/quote] 源码发出来，或者发我邮箱 klxs1996@163.com

user: user-0
content: 引用 1 楼 qq_21563855 的回复:不可能吧，我也是用你的方法做的，没有错误 和同学都是这样，我写的学生信息管理系统（有显示学生记录，删除学生记录等）。运行程序，如果第一个操作就是删除学生信息，就能成功删除指定学号的记录，但是再回到主菜单，继续执行删除学生记录，就不行了，没有提示。但写将不删除的记录写入备份文件stubak.dat成功，再删除原文件remove("student.dat")，在文件夹里也看到删除成功，再改名rename("stubak.dat","student.dat")也成功。可就是回到主菜单，显示学生记录，只删除了前一次操作的记录，第二次执行删除操作的记录还在里面。函数执行完都fclose()了，也测试过，关闭成功了。真是纠结。如果我运行程序，第一次是执行的显示学生记录的操作showInfomation()，再执行删除记录操作delRecord()，一样删不掉。各位大神，救命！！

user: user-3
content: 不可能吧，我也是用你的方法做的，没有错误
user-0 提问: 进程状态从阻塞状态到就绪状态是怎么改变的？

回复:
user: user-1
content: 唤醒原语

user: user-2
content: 这么说吧，曾经看嵌入式系统启动过程，有一个内核进程不会阻塞，由它负责改变其他进程的状态标记，并且把阻塞进程放入相应的阻塞队列，把就绪的进程放入对应的就绪队列中。

user: user-3
content: 程序的状态有操作系统管理

user: user-4
content: 《30天自制操作系统》

user: user-5
content: 取决于操作系统的调度机制

user: user-6
content: 这部分功能由内核的任务调度模块完成

user: user-2
user-0 提问: C语言_itoa_s函数求助

回复:
user: user-1
content: 学会使用数据断点： #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 提问: 传入指针参数的问题

回复:
user: user-1
content: 如果指针和整形不用转换的话。 举个例子 struct ms{}; void func(ms* sss) {} 你直接传一个int给那么 那么 ms* m = (ms*)malloc(sizeof(ms)*10); func(m+1); 相当于把m当成一个数组，把第二个数组元素地址给了func 如果你直接给整形， 比如 m的地址值 0x123; func(0x123+1) 给了函数，它无法计算具体的数据，会引起混乱。

user: user-2
content: 这个应该是编译器实现的问题吧，不支持参数的隐式转换吧！

user: user-3
content: 楼主的头像和我的电脑壁纸是同一个猫。

user: user-4
content: void MezM (int  *fp){     printf ("传入的地址为： ox%0x\n", fp); }  这样就可以了

user: user-5
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-1
content: 如果不需要强制转换，那么也就是说，整形=指针。 这样合理吗？

user: user-0
content: 我知道是打印里面的数据，只是用来做验证的。问题是在传参的地方，为什么不强制转换传入的立即数地址值，编译器会报错呢

user: user-1
content: printf ("传入的地址为： %d \n", *fp);打印的不是fp的地址，而是那个地址里面的数据

user: user-6
content: 这样的调用 MezM (0x22ff1c); 这个0x22ff1c是整型的数值，而函数的申明 void MezM (int  *fp) 明确要求入参是一个指向int类型的指针；所以直接传入整型的0x22ff1c是不行的，因为编译器会认为“入参类型不匹配”，因为报错。 这样 MezM ((int*)0x22ff1c); 强制转换就不会报错了。  在嵌入式开发中，经常有这样的用法，比如BASE_ADDR = 0x12345678; typedef struct _user_data_t {     int id;     char data[16]; }user_data_t  ; 要取出BASE_ADDR地址中存的id值，可以这样访问 ((user_data_t  *)BASE_ADDR )->id  注意，这里都是先要将整型的地址值强制转换为需要的类型指针，再通过指针的形式访问数据。
user-0 提问: c调用动态链接库(*.dll)文件

回复:
user: user-1
content: LoadLibrary动态调用.dll

user: user-2
content: 个人觉得1楼的建议好些（系统环境变量path中添加相应的路径），虽然放到system32或syswow64目录下也行，但自己的程序终究放到自己运行的目录下好些

user: user-3
content: 动态调用dll

user: user-4
content: 在64位Windows下： 64位exe和dll在目录c:\windows\system32目录下； 32位exe和dll在目录c:\windows\syswow64目录下；

user: user-5
content: 环境变量或者绝对路径dllopen

user: user-6
content: 在Windows上，如果是小应用，最好还是放在应用程序同一目录，没必要污染系统环境变量，减少对系统设置依赖性。

user: user-7
content: dllopen()或dllmopen()函数

user: user-8
content: 楼上是一种解决办法，还有一种解决办法是将报错dll丢到C:\Windows\System32或者C:\Windows\SysWOW64下面，不过不建议这样做，可以采用楼上的方法，将dll所在路径增加至系统环境变量path。

user: user-9
content: 系统环境变量path中包括dll路径即可
user-0 提问: 请问这段C代码是否有逻辑漏洞，如果有，那么这个逻辑漏洞是否可以被利用？

回复:
user: user-1
content: 引用 13 楼 汪大宇Y的回复:我想知道下那个main函数里的一串字符是什么呀，新手刚入学，请指教 main函数的参数，假装看不见

user: user-2
content: 增加处理输入字符串或特殊符号产生的死循环

user: user-3
content: 我想知道下那个main函数里的一串字符是什么呀，新手刚入学，请指教

user: user-4
content: 个人觉得有以下问题： 1 number没有定义； 2 没有对输入是否是数字进行检测； 修改的代码如下 	int number;//定义number 	for (;;) { 		printf("输入number: "); 		//------------以下代码判断输入的是否是数字----------------- 		char buffer[81]; 		int i, ch; 		for(i = 0; (i < 80) && ((ch = getchar()) != EOF) && (ch != '\n'); ++i)  		{  			if(ch<'0' || ch>'9')  			{ 				printf("输入的不是数字.\n"); 				break; 			}  			buffer[i] = (char)ch;  		} 		rewind(stdin);//清空输入缓冲区 		number = atoi(buffer);//将字符串转换为int 		if (number == 0) { 			break; 		}  		if (number > 10) { 			if (number == 11) { 				printf("number = 11.\n"); 			} 		} 	} 代码运行效果如图所示  对于getchar()函数和在控制台中判断输入是否是数字的相关知识，请参考 《C++中getchar()的使用方法》 《C++控制台程序判断输入的数字》 希望能够帮到你

user: user-3
content: 这个程序好像死循环了

user: user-5
content: 无非是程序健壮性不行呗，一般通用异常输入的处理就是让用户重新输入，并增加计数器，如果短时间内多次异常输入程序告警退出 引用 6 楼 yyxgs 的回复:回复楼上各位，这段代码是手写的，当时确实忘了定义number，请忽略掉这一点。 提这个问题是因为我写了一个程序，处理 list *命令。 而list *命令的逻辑判断下，比如有list available，list banned的处理，而输入一个list 123，程序没有这个判断，所以直接再次循环，提示输入命令，我就想这是否属于逻辑漏洞，可否被利用。

user: user-6
content: 代码本身来说没有漏洞，个人之见。

user: user-0
content: 算了，可能是我描述不清楚。大家的关注点都在number没有定义和输入非数字字符上，结贴。

user: user-7
content: 这段代码有什么逻辑性可言吗？

user: user-8
content: #include <stdio.h>   int main(int argc, char* argv[]) {     for (;;) {         printf("输入number: ");         ret = scanf("%d", &number);         if (ret != 1)               continue;         //getchar();                   if (number == 0) {             break;         }                   if (number > 10) {             if (number == 11) {                 printf("number = 11");             }         }     }           return 0; } 去掉getchar();判断scanf的返回值

user: user-0
content: 引用 2 楼 冷风1023 的回复:1、number没有定义 2、输入不是整型的处理 3、输入到下一次没有刷新  第3点能否解释一下是什么意思？

user: user-0
content: 回复楼上各位，这段代码是手写的，当时确实忘了定义number，请忽略掉这一点。 提这个问题是因为我写了一个程序，处理 list *命令。 而list *命令的逻辑判断下，比如有list available，list banned的处理，而输入一个list 123，程序没有这个判断，所以直接再次循环，提示输入命令，我就想这是否属于逻辑漏洞，可否被利用。

user: user-9
content: 都跑不起来的

user: user-2
content: 你这个编译都是问题，跑都跑不跑起来。理论上来说是没有漏洞的，因为你都没跑起来，更别说漏洞了，哈哈。

user: user-5
content: 编都编不过还谈什么逻辑漏洞

user: user-10
content: 1、number没有定义 2、输入不是整型的处理 3、输入到下一次没有刷新

user: user-11
content: 楼主这个代码编译不过吧，number的类型呢？ 如果输入number的时候，不输入数字，比如输入一串字母？
user-0 提问: 关于fopen()函数的一些疑问

回复:
user: user-1

user: user-1
content: 对于疑问2：看一下维基百科的说明 https://zh.wikipedia.org/wiki/%E4%BB%A3%E7%A0%81%E9%A1%B5

user: user-1
content: 先说疑问1吧：当使用单字节字符串时，fopen使用ANSI代码页解释文件名字符串，但是可以用Windows API SetFileApisToOEM函数将其更改为使用OEM解释文件名字符串。

user: user-2
content: 字符编码主要有两个钟形式utf8和GB2312
user-0 提问: c语言 为什么不能随便在程序中，任意加{}，组成代码块？

回复:
user: user-1
content: 引用 9 楼 自信男孩 的回复:[quote=引用 8 楼 lin5161678 的回复:] [quote=引用 6 楼 自信男孩 的回复:] [quote=引用 1 楼 lin5161678 的回复:] if(exp)     D0(); else      Statement 这样写会找出语法错误 else 没有匹配的if  用D1 就不会 没看出来会有语法错误。宏定义就是替换 if(exp)     D0(a, b); else      Statement 就是替换为如下：  if(exp) {     a++；     a+b; } else      Statement [/quote]注意分号 if(exp) {     a++；     a+b; }; else      Statement [/quote] 没看到;，去掉;号就可以了。  另外，这样D1也是[/quote] D0去掉分号的确可以  但是这要求使用你的宏的人  用那个宏就不加分号 用这个宏就加分号 增加多余的记忆负担  D1 不能去掉分号 do-while 结尾的 分号是语法格式的要求是必须写的

user: user-2
content: 第二种能保证在几乎各种“合法”代码里都有正确结果。遇见的奇怪代码多了，你自然就会明白的。 效率，在开启优化编译的情况下，正常的编译器都应该得到相同的结果。

user: user-3
content: 理解和讨论之前请先学会如何观察！  VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

user: user-4
content: 关于宏定义引发的使用时带不带；一直争论不休，仁者见仁智者见智。。。。第一种方法对于习惯宏定义后面加；的人来说是个错误，但是第二种方法对于不习惯宏定义加；的人来说也是个错误。没有绝对的对与错，理解就好。

user: user-5
content: 引用 8 楼 lin5161678 的回复:[quote=引用 6 楼 自信男孩 的回复:] [quote=引用 1 楼 lin5161678 的回复:] if(exp)     D0(); else      Statement 这样写会找出语法错误 else 没有匹配的if  用D1 就不会 没看出来会有语法错误。宏定义就是替换 if(exp)     D0(a, b); else      Statement 就是替换为如下：  if(exp) {     a++；     a+b; } else      Statement [/quote]注意分号 if(exp) {     a++；     a+b; }; else      Statement [/quote] 没看到;，去掉;号就可以了。  另外，这样D1也是

user: user-1
content: 引用 6 楼 自信男孩 的回复:[quote=引用 1 楼 lin5161678 的回复:] if(exp)     D0(); else      Statement 这样写会找出语法错误 else 没有匹配的if  用D1 就不会 没看出来会有语法错误。宏定义就是替换 if(exp)     D0(a, b); else      Statement 就是替换为如下：  if(exp) {     a++；     a+b; } else      Statement [/quote]注意分号 if(exp) {     a++；     a+b; }; else      Statement

user: user-1
content: 引用 6 楼 自信男孩 的回复:[quote=引用 1 楼 lin5161678 的回复:] if(exp)     D0(); else      Statement 这样写会找出语法错误 else 没有匹配的if  用D1 就不会 没看出来会有语法错误。宏定义就是替换 if(exp)     D0(a, b); else      Statement 就是替换为如下：  if(exp) {     a++；     a+b; } else      Statement [/quote]就是替换为如下： if(exp) {     a++；     a+b; }; else      Statement

user: user-5
content: 引用 1 楼 lin5161678 的回复:if(exp)     D0(); else      Statement 这样写会找出语法错误 else 没有匹配的if  用D1 就不会 没看出来会有语法错误。宏定义就是替换 if(exp)     D0(a, b); else      Statement 就是替换为如下：  if(exp) {     a++；     a+b; } else      Statement

user: user-6
content: 一般使用第二种，应为更简明，不过效率相比前者较低

user: user-7
content: 2更通用点，但效率稍微低一点点 如果是大项目，很多人开发，建议用2，小项目无所谓

user: user-8
content: 我觉得第一种没问题

user: user-9
content: do {} whil(0) 在编译器做优化时，已经相当于没有了，联系楼主可以参考下 Linux内核的宏设计，学习下 《从小小的宏定义窥探Linux内核的精妙设计》, 一起来围观吧 https://blog.csdn.net/szullc/article/details/84779352

user: user-1
content: if(exp)     D0(); else      Statement 这样写会找出语法错误 else 没有匹配的if  用D1 就不会
user-0 提问: 求求会C语言的大牛救场，判断卡壳了

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

user: user-2
content: 怎么可能卡在这个函数，一定是你定位方向错了

user: user-3
content: 有个人想在一条河上造桥，但是不太会造，就想尽各种办法造了一座。怎么造的呢，在河的同一侧建了四个桥墩，用石头拱起来，但是发现达不到渡河的目的，就各种求助，想找人从旁协助一下，让它正常使用，但是，你真的具备设计桥的知识储备吗？你能造好最关键的四个桥墩吗？你想让别人帮你铺桥，你得先自己造好四个桥墩！不然桥造好了，也只是别人的成果，你不会的还是不会。谁也不是天生就会造桥，只是希望那些不会造的人多观摩一下别人的桥，好好学学怎么造桥墩。

user: user-4
content: for(i=0;i<999;i++)     {         printf("请输入信息\n");         printf("订单编号:");         scanf("%d",&i);         student.num=i;         printf("名字:");         scanf("%s",student.name);         printf("套餐:");         scanf("%s",student.style);         printf("数量:");         scanf("%d",&student.sl);         printf("订单时间:");         scanf("%s",student.time);         printf("地址:");         scanf("%s",student.add);         printf("\n录入成功\n");         printf("是否继续创建数据(继续创建按1/返回菜单按0):");         scanf("%d", &or);         if (or==0)         {             break;         }     } 真个程序有一个普遍的问题，那就是student是数组名，能直接student.add这样用吗？  void all()   //显示所有订单 {     int i;     printf("编号    名字    套餐    数量   订单时间     地址\n");     for(i=0;((student[i].sl)!=0);i++)     {         //printf("%-8d%-9s%-7s%-7d%-13s%s\n",student.num,student.name,student.style,student.sl,student.time,student.add);         printf("%-8d%-9s%-7s%-7d%-13s%s\n",student[i].num,student[i].name,student[i].style,student[i].sl,student[i].time,student[i].add);     } } 这是我的一个修改；  我估计楼主的代码是无法编译不过去的。  void sum() {     int i=0;     //if (student[0].style='c')     if (student[0].style=='c')         i++; } 当然也有真个问题，但是真个sum有什么作用呢？计算的i给谁？定义的是void类型的返回值。  建议先看一下数组的使用，真个是最大的问题。

user: user-5
content: i变量只能用于sum函数中，函数没有任何输出，就算这个函数统计了订单你也看不到啊

user: user-6
content: 设断点，单步调试下，应该很清楚的

user: user-0
content: 这样也不行啊

user: user-7
content: student[0].style=='c'
user-0 提问: c语言程序流程图

回复:
user: user-1
content: 判断平闰年后面 year%400==0; 应该这样的吧

user: user-2
content: 先把程序看懂吧，不要为了应付，多对自己负责吧

user: user-0
content: 引用 1 楼 一念通慧的回复:代码都写出来了，流程图怎么还画不出来了呢？ 程序是老师给的 让我们画流程图

user: user-3
content: 用visio画很简单的

user: user-4
content: 代码都写出来了，流程图怎么还画不出来了呢？
user-0 提问: 求一本中英文（双语）的C语言教程，谢谢各位大侠。

回复:
user: user-1
content: 引用 楼主 weixin_41794845 的回复:求一本中英文（双语）的C语言教程，谢谢各位大侠。 最好是近几年的，适合大学本科生初学者使用的。 如果有PPT，课本例题源码，习题源码一起的话，就在这里跪谢了。 C语言程序设计 现代方法 非常棒的书籍，要是没有记错，已经是第二版了

user: user-2
content: 估计是没有这种的，又不是英汉读物。不过你可以同时用中文版加英文原版的（或者pdf）。

user: user-3
content: 可以考虑英文和中文版本各买一本。不过，如果但从学习技术方面上好像没必要
user-0 提问: 关于数组结束符的问题

回复:
user: user-1
content: 基本语法就不对 stu.s_r_BACK_CAT_CODE[101].arr[stu.s_r_BACK_CAT_CODE[101].len]='\0' 不应该是stu.s_r_BACK_CAT_CODE[101][len] = '\0'么 为啥多了个莫名其妙的arr

user: user-2
content: 先初始化成\0，然后再赋值就行了

user: user-0
content: 对的，就是这一句话编译不过去 不是varchar的值，读出来要补一个结束符嘛 arr 不是varchar类型的内容属性嘛

user: user-3
content: stu.s_r_BACK_CAT_CODE[101].arr[stu.s_r_BACK_CAT_CODE[101].len]='\0' 这句编译不过去吧 s_r_BACK_CAT_CODE和arr是什么关系？从数据结构上看不出什么关系

user: user-0
content: 什么意思？ 没明白
user-0 提问: sprintf打印成字符串，首位0如何打出来？

回复:
user: user-1
content: 其实就是格式问题，%08d,%-08d，%d等的区别。

user: user-2
content: 其实是输出格式的问题，scanf/printf/fprintf是格式化输入输出，可以通过不同的格式符输出不同的数据格式。%8x改成%08x即可。 还可以通过x的大小写来输出16进制a~f的大小写。

user: user-3
content: 引用 1 楼 leehh 的回复:sprintf((char *)buf,"%08x%08x%08x",ID[0],ID[1],ID[2])； +1

user: user-4
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-0
content: sprintf((char *)buf,"%08x%08x%08x",ID[0],ID[1],ID[2])；
user-0 提问: 求助关于PTA1009求和运算的问题

回复:
user: user-0

user: user-0

user: user-0

user: user-1
content: 建议贴出更多信息，比如你的输入信息，输出结果等等；      for(i=0;i<number;i++)         scanf("%ld%c%ld",&son[i],&c,&mother[i]); 这个地方很可能是你的输入有问题，因为这里有%c，很可能出现你的输入和你的想要的输入不一致。

user: user-2
content: 表示看你的代码真不如看题目来的直接，虽然不明白你想干嘛。 scanf("%ld",&number); for(i=0;i<number;i++)//这里是不是漏了大括号了，为什么没有大括号会有缩进     scanf("%ld%c%ld",&son[i],&c,&mother[i]);     for(i=0;i<number;i++)

user: user-3
content: 既然你题目都不说了 那我就问题也不答了 来呀 互相伤害呀 斜眼.jpg

user: user-0
content: 自己顶下
user-0 提问: 在Windows下，C 关于写入文件的时候遇到的一个问题

回复:
user: user-0
content: 引用 3 楼 user-2 的回复:[quote=引用 2 楼 会瞬移的猪 的回复:] [quote=引用 1 楼 user-2 的回复:] 首先 你写的2段代码 属于未定义行为 不要这样做了  然后 你的两个问题其实都是一个问题 并且和C没什么关系  notpad这个软件本身是通过对文件数据分析 猜测文件编码  出现乱码就只是猜错了  顺便 代码2 前面不是2个空格 是2个NUL 只是notpad无法表示NUL而已 你用notpad++打开就能看到2个NUL了   谢谢。 但是是哪一句代码是未定义行为呢？如果是fseek()函数的话，microsoft visual studio上的开发文档说可以在文件结尾外放置指针，并清除文件结尾指示器。你说的意思是这个功能是微软自己添加上去的，而c标准定义该函数的时候是没有定义这个行为的吗？还是？[/quote]的确是fseek 这个函数的用法属于未定义行为 但不是 因为越过 文件结尾  是因为你的文件打开方式  文本模式 fseek 用SEEK_SET 之外的模式都属于 未定义行为的  [/quote]  谢谢。

user: user-1
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: 引用 2 楼 会瞬移的猪 的回复:[quote=引用 1 楼 user-2 的回复:] 首先 你写的2段代码 属于未定义行为 不要这样做了  然后 你的两个问题其实都是一个问题 并且和C没什么关系  notpad这个软件本身是通过对文件数据分析 猜测文件编码  出现乱码就只是猜错了  顺便 代码2 前面不是2个空格 是2个NUL 只是notpad无法表示NUL而已 你用notpad++打开就能看到2个NUL了   谢谢。 但是是哪一句代码是未定义行为呢？如果是fseek()函数的话，microsoft visual studio上的开发文档说可以在文件结尾外放置指针，并清除文件结尾指示器。你说的意思是这个功能是微软自己添加上去的，而c标准定义该函数的时候是没有定义这个行为的吗？还是？[/quote]的确是fseek 这个函数的用法属于未定义行为 但不是 因为越过 文件结尾  是因为你的文件打开方式  文本模式 fseek 用SEEK_SET 之外的模式都属于 未定义行为的

user: user-0
content: 引用 1 楼 user-2 的回复:首先 你写的2段代码 属于未定义行为 不要这样做了  然后 你的两个问题其实都是一个问题 并且和C没什么关系  notpad这个软件本身是通过对文件数据分析 猜测文件编码  出现乱码就只是猜错了  顺便 代码2 前面不是2个空格 是2个NUL 只是notpad无法表示NUL而已 你用notpad++打开就能看到2个NUL了   谢谢。 但是是哪一句代码是未定义行为呢？如果是fseek()函数的话，microsoft visual studio上的开发文档说可以在文件结尾外放置指针，并清除文件结尾指示器。你说的意思是这个功能是微软自己添加上去的，而c标准定义该函数的时候是没有定义这个行为的吗？还是？

user: user-2
content: 首先 你写的2段代码 属于未定义行为 不要这样做了  然后 你的两个问题其实都是一个问题 并且和C没什么关系  notpad这个软件本身是通过对文件数据分析 猜测文件编码  出现乱码就只是猜错了  顺便 代码2 前面不是2个空格 是2个NUL 只是notpad无法表示NUL而已 你用notpad++打开就能看到2个NUL了
user-0 提问: [C语言] 关于函数指针的疑惑

回复:
user: user-1
content: 可以类比数组名和数组地址吧，比如int a[10]中，a这个变量同时也是这个数组的首地址，而&a同样是这个值，但是意义不同

user: user-2
content: 函数名隐式类型转换 指向这个函数的指针  对函数指针执行 * 操作 得到一个函数  然后 这个函数又会重新隐式类型转换成 指向这个函数的指针  无限递归  你甚至可以 (**************************************************aTest)(3,5) 这样来调用 aTest函数 虽然没什么意义就是了

user: user-3
content: 这和数组名差不多吧。数组名是数组的首地址，本身就是地址。而函数名也是地址，是函数的首地址（使用入口地址更确切）；

user: user-4
content: 同样一个语法元素要在上下文中才能确定其具体语义，这一点编程语言和我们平时说的语义是一样的。 说白了就是同一种符号，在不同的语句中表达的含义不同，这是语法规则决定的。拿你这个例子来说，就是&p p *p三个东西来，在当p是一个普通变量时、当p是一个普通变量一级指针时、当p是一个普通变量二级指针时、当p是一个函数指针时......这些场景下的三个东西代表的含义是不一样的，具体是什么含义就是你所看到的。 再举一个简单的例子，“abcd”是同样的，但在printf("abcd")和sizeof("abcd")两句话中的类型是完全不同的。 总之有些语义可以通过语法来推测，而有一些则不能“推广”，这本身也是语法的一部分。
user-0 提问: 求书求书啊大佬们

回复:
user: user-1
content: 搜C基础或者C++基础。随表一本都差不多，结构就是定义，真正用到了才是纠结的时候

user: user-2
content: 数据结构与算法（C语言版）

user: user-3
content: 《数据结构与算法分析》

user: user-4
content: 记得学校发的数就可以的。如果想边学边实践（有例子的），可以考虑看一下《C programming  plus》
user-0 提问: MS-DOS下运行程序卡死怎么退出的问题

回复:
user: user-1
content: Ctrl+C 即可中断

user: user-2
content: 引用 1 楼 super_admi 的回复:进入MS-DOS，狂按Ctrl+C应该也可以，直接中断。  话说，你这不是调试MS-DOS程序的状态啊，好歹配置下Config.sys或者在Autoexec.bat中写个分支。  对，这个绝对可以的

user: user-3
content: MS-DOS，中断应该是 Ctrl+C  难道现在还有在这上面开发程序？

user: user-4
content: CTRL+BREAK

user: user-5
content: 进入MS-DOS，狂按Ctrl+C应该也可以，直接中断。  话说，你这不是调试MS-DOS程序的状态啊，好歹配置下Config.sys或者在Autoexec.bat中写个分支。

user: user-6
content: Ctrl+C

user: user-7
content: 分的高分段分的高分段

user: user-8
content: 多刷新几次，不行再关机重启试试

user: user-9
content: 什么年代了，还用free dos

user: user-10
content: 多多钻研，，，，

user: user-11
content: 简述：非蓝牙模式，普简述：非蓝牙模式，普通音箱和普通耳机连接电脑，声音没有延迟。蓝牙模式连接蓝牙音箱，则蓝牙音箱的声音出现明显的延迟5-6秒。通音箱和普通耳机连接电脑，声音没有延迟。蓝牙模式连接蓝牙音箱，则蓝牙音箱的声音出现明显的延迟5-6秒。

user: user-0
content: 引用 4 楼 ooolinux 的回复:[quote=引用 2 楼 zhoup20 的回复:] [quote=引用 1 楼 ooolinux 的回复:] MS-DOS什么版本？纯DOS是16位的，老的Turbo C或Turbo Pascal等写的程序才可以运行。Win9x带的DOS是32位的。 纯MS-DOS系统下的，版本好像是5点几，程序是我用Turbo C编译后用U盘拷进去的，拷贝的时候有点问题，现在系统一直运行那个程序，我不知道怎么退出来[/quote]  用DOSBox试试。  C与C++程序设计学习与实验系统 2013.3 可以不用建立项目（单文件），简单的试验代码甚至不用保存为文件，直接编译运行观察结果，比较方便。 只有几十M大小。自带GCC编译器、VC 6.0编译器和TC编译器（选项可设置），自带DOSBox运行TC生成的exe程序。  TC（Turbo C）老代码（比如小游戏）最好看懂了以后，理解了算法和过程，用VC改写成Windows平台的。 [/quote]谢谢，主要是这系统运行在PC104里

user: user-0
content: 引用 3 楼 user-13 的回复:开机后  多次F5 可以跳过config.sys 和 autoexec.bat, 或者F8  选择性启动恩恩，好的，我明天试试，感谢感谢

user: user-12
content: 引用 2 楼 zhoup20 的回复:[quote=引用 1 楼 ooolinux 的回复:] MS-DOS什么版本？纯DOS是16位的，老的Turbo C或Turbo Pascal等写的程序才可以运行。Win9x带的DOS是32位的。 纯MS-DOS系统下的，版本好像是5点几，程序是我用Turbo C编译后用U盘拷进去的，拷贝的时候有点问题，现在系统一直运行那个程序，我不知道怎么退出来[/quote]  用DOSBox试试。  C与C++程序设计学习与实验系统 2013.3 可以不用建立项目（单文件），简单的试验代码甚至不用保存为文件，直接编译运行观察结果，比较方便。 只有几十M大小。自带GCC编译器、VC 6.0编译器和TC编译器（选项可设置），自带DOSBox运行TC生成的exe程序。  TC（Turbo C）老代码（比如小游戏）最好看懂了以后，理解了算法和过程，用VC改写成Windows平台的。

user: user-13
content: 开机后  多次F5 可以跳过config.sys 和 autoexec.bat, 或者F8  选择性启动

user: user-0
content: 引用 1 楼 ooolinux 的回复:MS-DOS什么版本？纯DOS是16位的，老的Turbo C或Turbo Pascal等写的程序才可以运行。Win9x带的DOS是32位的。 纯MS-DOS系统下的，版本好像是5点几，程序是我用Turbo C编译后用U盘拷进去的，拷贝的时候有点问题，现在系统一直运行那个程序，我不知道怎么退出来

user: user-12
content: MS-DOS什么版本？纯DOS是16位的，老的Turbo C或Turbo Pascal等写的程序才可以运行。Win9x带的DOS是32位的。
user-0 提问: C语言菜鸟，两个横线填什么

回复:
user: user-1
content: int fun(int(*a)[N]) { 	int  i, j, m1, m2, row, colum; m1 = m2 = 0; 	for (i = 0; i<N; i++)//计算主对角线和反对角线的和 	{ 		j = N - i - 1;  		m1 += a[i][i]; //主对角线的和 		m2 += a[i][j];//反对角线的和 	} 	if (m1 != m2) 	{ 		return  0; 	} 	//计算每行和每列的和 	for (i = 0; i<N; i++) 	{ 		row = 0;//每次行的和要清零 		colum = 0;//每次列的和要清零，注意列的英语是column 		for (j = 0; j<N; j++) 		{ 			row += a[i][j];   			colum += a[j][i]; 		} 		if ((row != colum)||(row != m1)) 			//如果每行的和不等于每列的和 			//或者虽然每行的和与每列的和相等，但是它们与主对角线的和不相等 			return 0; 	} 	return 1; }

user: user-2
content: 在外部循环内，求每行每列的和。很简单，求和前对row, column清零0    for(i=0; i<N; i++) {row=0;      colomun=0;      for(j=0; j<N; j++)      {  row+=a[i][j];  colum+=a[j][i];  }         if( (row!=colum) ||   (row!=m1) )  return 0;
user-0 提问: 编程问题求助，以下程序输出结果是什么 求分析

回复:
user: user-1
content: 1楼和8楼都给出了详尽的回答，确实代码语法问题挺多，最重要的是传入指针给函数内部执行malloc是无法将malloc的地址传递出去的，需要传入二级指针，像8楼的那样，运行没有问题。

user: user-2
content: 首先上修改后的代码 #include<stdio.h> #include <stdlib.h> #include <string.h> using namespace std;  void GetMemory1(char **p1) { 	*p1 = (char*)malloc(100);        //malloc(100):开辟100个字节的临时分配域，函数值为其第1个字节的地址  }   void Test1(void) { 	char *str1 = NULL; 	GetMemory1(&str1); 	strcpy(str1, "hello world"); 	printf(str1); 	printf("\n");         free(str1); }  int main() { 	Test1(); 	system("pause"); 	return 0; }  VS2015+Windows10运行的效果如下  主要存在问题： 1 Test1()函数要在main()函数之外定义，且要先声明（定义）GetMemory1，在定义Test1()函； 2 要包含string.h头文件，该头文件中包含了strcpy()函数的声明； 3 在Test1()函数中要用free()函数释放动态分配的空间，以免引起内存泄漏； 4 GetMemory1()函数的参数应该是指针的指针，这样在Test1()函数中才能正确获取分配空间的地址； 关于函数参数是指针的指针类型的相关知识，请参考《C++中函数参数类型为指针的指针》 希望能够帮到你

user: user-0
content: 谢谢各位的解答！

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

user: user-4
content: 看上去像是面试改错题

user: user-5
content: 这个问题，笔试和面试都问烂了吧，随便搜一下到处都是答案，比这里的回答可以详细多了

user: user-6
content: 结果是运行会出现段错误；因为str1是指向NULL，即不可读写的位置。strcpy就是对其写，因此会出现段错误；  可能会说给其分配空间了，只是分配的空间的首地址并没有存在str1中，即分配空间的函数并没有修改str1的值，对str1没有影响，另外还导致内存泄漏，因为GetMemory1函数执行之后，申请的空间找不到了，无法手动释放它了。

user: user-7
content: 我先说结果哈, 结果就是没输出, 啥也没有, 就算有, 也是直接崩溃这么一个结果.  首先, 我先说这代码写的有很多语法错误: 1. void GetMemory1(char *p1) 这个函数没有函数声明. 2. 用 strcpy() 需要 #include <string.h> 3. printf 输出字符串应该为 printf ("%s", str1);  (你的写法是 puts() 的用法)  4 !!!!!!!! 最重要的一点 !!!!!!!!  c 语言不能在函数里面定义函数啊啊啊啊啊啊, 即使是主函数也不可以 !!!!!!!!!!  上面的如果都更改之后! ( 我尽量猜测一下你想干嘛..) 就变成了下面这样:   #include <stdio.h> #include <stdlib.h> #include <string.h>  void GetMemory1(char *p1); void Test1(void);  int main(){     Test1();     return 0; }  void Test1(void){      char *str1=NULL;      GetMemory1(str1);      strcpy(str1,"hello world");      printf("%c", str1[0]);     printf("\n"); }  void GetMemory1(char *p1){     p1=(char*)malloc(100);        //malloc(100):开辟100个字节的临时分配域，函数值为其第1个字节的地址 }   这样依然会报错, malloc虽然会在堆中开辟空间, 也将地址赋值给了p1,   但由于 p1 只是形参, 即使给他赋值了, 他也更改不了,   返回主调函数, 他原来是啥现在就依然还是啥, (这一点可能你对指针理解有点问题, 仔细看看书好好理解一下指针做函数参数是怎么回事)  正因如此, test1() 调用的 GetMemory(), 所以 str1 的值还是 NULL .  str1 就只是一个指针, 并没有为他分配空间, 在给他 strcpy() 时, 会报指针越界的错误.  所以!!!! 真的没有输出 !!!!!   ps: 头一回发评论, 不知道说的全不全, 大佬看到我说的如果有错误, 千万要指正..跪谢..
user-0 提问: C语言

回复:
user: user-1
content: 应该说多维数组是一维数组的数组（的数组。。）

user: user-2
content: strcpy(data[0][0], "xxx");  注意数组越界问题。  字符串赋值除了初始化可以直接赋值，其他情况建议借助字符串处理函数

user: user-1
content: 多维数组的最后一维是一个一维数组，比如三维数组char data[3][5][20]，data[0][0]就是一维数组了，也是该一维数组的首地址，等于&data[0][0][0]。给这个地址strcpy就可以了。 谭浩强的那本书讲多维数组还是蛮清楚的，可以参考一下。

user: user-3
content: 引用 7 楼 qq_41771408 的回复:为什么不能直接data[0][0]="数据已删除!";呢data[0][0]是一个数组 类型是 char[20] 数组都不能赋值不是常识么

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

user: user-0
content: 为什么不能直接data[0][0]="数据已删除!";呢

user: user-5
content: strcpy(),不能直接初始化

user: user-6
content: 1、strcpy/strcpy_s 2、sprintf/sprintf_s 3、memcpy/memcpy_s

user: user-7
content: 1. 使用strcpy() 2. 可以循环拷贝。

user: user-8
content: strcpy() 在 string.h 中 如下:  #include <stdio.h> #include <string.h>  int main(){     char data[2][6][20];     strcpy(data[0][0], "数据已删除!");     puts(data[0][0]);     return 0; }

user: user-9
content: 定义的时候直接用字符串赋值  注意：不能先定义再给它赋值  可以利用strcpy

user: user-10
content: strcpy_s
user-0 提问: 【C语言】多级指针如何确定类型？

回复:
user: user-1
content: 这个问题需要通过具体的应用去分析

user: user-2
content: 建议结合例子分析指针类型可能会更好一些，可以找一些例子分析一下，同时通过调试打印验证自己猜测或者别人的结论。

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: user-4
content: char*是用来指向char的，char**用来指向char*，char***用来指向char**......这样下去，每一级都是有类型限制的，最终的结果就是像你说的一样。 建议你把char**也看做一种特定的类型，它char在语法上是同等地位的，而不是某种用来“过渡”的东西。

user: user-5
content: char **p 是一个指向char*型变量地址的指针，而char*型变量指向一个char型变量的指针。
user-0 提问: 指向指针的指针, 获取数据为何是 *((key_type**) 

回复:
user: user-0
content: 引用 1 楼 老马何以识途 的回复:default_configs[0]即&csr_stereo_default_config，它是一個config_type指針，即一個config_type結構的首地址，這個地址同時也是其第一個元素battery_config的地址，，也就是説如果對它進行*運算，得到的當然就是battery_config的内容了。battery_config的内容是什麽呢？就是一個key_type*，其地址當然是key_type**，所以爲了類型正確，先做一個key_type **轉換。  爲了理解“一個config_type結構的首地址，這個地址同時也是其第一個元素battery_config的地址”這句話，我們舉一個簡單例子：   struct example {         int age;         int num; } a*;   這個a所指向的地址見下圖：    age的地址怎麽表示呢？其實首地址依然是a，這時候我們只要强制轉換：   int * b = (int *)a;   就可以得到它了。 感谢谢谢谢谢, 关键在于引用battery_config的内容是什麽呢？就是一個key_type*，其地址當然是key_type** 此句, 此前没有想到.赞!

user: user-1
content: 《牛肉干》 C语言上机课，某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上，卡在7和8键之间。 女同学就在键盘上抠啊、抠啊、抠啊…… 程序里一行代码变成这个样子： int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————程序顺利通过编译，运行结果正确！

user: user-2
content: default_configs[0]即&csr_stereo_default_config，它是一個config_type指針，即一個config_type結構的首地址，這個地址同時也是其第一個元素battery_config的地址，，也就是説如果對它進行*運算，得到的當然就是battery_config的内容了。battery_config的内容是什麽呢？就是一個key_type*，其地址當然是key_type**，所以爲了類型正確，先做一個key_type **轉換。  爲了理解“一個config_type結構的首地址，這個地址同時也是其第一個元素battery_config的地址”這句話，我們舉一個簡單例子：   struct example {         int age;         int num; } a*;   這個a所指向的地址見下圖：    age的地址怎麽表示呢？其實首地址依然是a，這時候我們只要强制轉換：   int * b = (int *)a;   就可以得到它了。
user-0 提问: 有没有人还在用pro c 的，有一个连接问题

回复:
user: user-1
content: 参考：  Pro *C/C++学习笔记（一）

user: user-2
content: pro*c是效率最高的访问oracle的方式，也许除了oci？ oracle_id里可以使用 用户/密码@数据库地址/数据库名 这样的格式 或者在tnsname.ora里设置，就可以直接使用  用户/密码@配置好的连接名

user: user-3
content: Oracle是用tns listener連接的，你需要到Oracle客戶端中配置這個東西。
user-0 提问: 一道数据结构题目

回复:
user: user-0
content: 整理一下，不知道分析正不正确，忘高手和大神指教：   1）设D(i)为第i个节点的比较次数，等于 大于等于其深度的最小整数；对于具有N个节点的树： C（成功查找）= [D(1) + ... + D(N) ] / N； 而不成功查找的节点最后一次比较必然在树的叶子节点上，可以认为与每个叶子节点比较的概率相等，故不成功查找的平均比较次数为 大于等于平均高度的最小整数； 2）对于完全二叉查找树，深度为d的层的节点数为 Nd = 2^d，则深度为k的完全二叉查找树的总节点数为：N = 2^(k+1) - 1, 设每个节点的被查找的次数相等， a.则成功查找的平均比较次数为： Avg（成功查找）= （1 * 2^0 + 2*2^1 + 3*2^2+...+(k+1)*2^k）/ N; 又因为 S(n) = 1 + 2*2 + 3*2^2 +...+(n+1)*2^n=n*2^(n+1) + 1，（k=0,1,2,...,n）; 故   Avg（成功查找）= [k*2^(k+1) + 1] / [2^(k+1) - 1] = k + (k + 1) / [2^(k+1) - 1];  k <= Avg <= k + 1, k = log (N + 1) - 1,  -->  log(N+1) -1 <= avg <= log(N + 1),即平均查找次数为 大于等于logN的最小整数； b.若不成功查找，每次比较的次数都等于其 （树高 + 1 = 大于等于logN的最小整数）；

user: user-0
content: 对于完全二叉查找树，深度为d的层的节点数为 Nd = 2^d，则深度为k的完全二叉查找树的总节点数为：N = 2^(k+1) - 1, 设每个节点的被查找的次数相等， 1）则成功查找的平均比较次数为： Avg（成功查找）= （1 * 2^0 + 2*2^1 + 3*2^2+...+(k+1)*2^k）/ N; 又因为 S(n) = 1 + 2*2 + 3*2^2 +...+(n+1)*2^n=n*2^(n+1) + 1，（k=0,1,2,...,n）; 故   Avg（成功查找）= [k*2^(k+1) + 1] / [2^(k+1) - 1] = k + (k + 1) / [2^(k+1) - 1];  k <= Avg <= k + 1, k = log (N + 1) - 1,  -->  log(N+1) -1 <= avg <= log(N + 1),即平均查找次数为 大于等于logN的最小整数； 2）若不成功查找，每次比较的次数都等于其 （树高 + 1 = 大于等于logN的最小整数）；
user-0 提问: 数据结构 顺序表 结构体

回复:
user: user-1
content: 建议贴出数据结构

user: user-2
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]   不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: data.[i].key 这个是啥意思？

user: user-4
content: data  是咋个申明和定义的