Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: c语言

回复:
user: user-1
content: 仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-2
content: 闲来无事，写一个玩玩。 #include <stdio.h> #include <stdlib.h>  int main (void) {     # define N 5     unsigned gusum = 0, inpud [1];      for (unsigned m = 0; m < N; m ++)         scanf ("%d", inpud), gusum += * inpud % 10;      printf ("%u\n", gusum); }
user-0 提问: 我没弄懂其原理，求大佬讲解

回复:
user: user-1
content: 回调函数，根据栈的原理：先进后出。  回调函数是申请函数栈。

user: user-2
content: 关于递归 需要搞清楚最核心的一点是 函数结束会返回到函数调用的地方这句话  你在reverse里面调用reverse 在内层的reverse调用完成 返回是返回到reverse里面而不是main里面 这里 main调用reverse 进入reverse 第一件事给c分配地址 假设 1000 然后调用getchar 给地址1000赋值 假设是a 这时候调用了reverse 进入reverse 第一件事给c分配地址 假设 1004 然后调用getchar 给地址1004赋值 假设是b 这时候调用了reverse 进入reverse 第一件事给c分配地址 假设 1008 然后调用getchar 给地址1008赋值 假设是\n 然后判断地址1008的值是\n 所以不执行输出  函数结束 释放占用内存 1008 开始返回 返回这时候调用了reverse 后面的代码是 判断1004的值是不是\n 结果不是\n输出1004地址的内容 也就是b 函数结束 释放占用内存 1004 开始返回 返回这时候调用了reverse 后面的代码是 判断1000的值是不是\n 结果不是\n输出1000地址的内容 也就是a 函数结束 释放占用内存 1000 开始返回 返回这里 main调用reverse ......

user: user-3
content: reverse是个递归函数， 递归函数分析首先找退出条件， void reverse() { char c; if((c=getchar())!='\n')  ==》这边是退出的条件   reverse();   ==》这边自己掉了自己   if(c!='\n')      putchar(c);       } 程序是一步步向下执行的，那看一下你这个程序执行顺序： 1.执行main里面的reverse函数，然后从键盘获得一个字符’a'，这个时候字符没有putchar，然后又进入到reverse函数，输入‘b'，这个时候又没有putchar，继续进入reverse函数，这个时候输入’\n‘ 2.判断是'\n'，退出，回到你输入’b'的然后调用reverse，程序继续执行，这个时候putchar，再回到你输入a的时候。。。 就是倒着输出的了
user-0 提问: c语言的问题  详细问题请点开看一下

回复:
user: user-0
content: 嗯嗯 性质 1：是偶数； 性质 2：大于 4 且不大于 12。 小A 喜欢这两个性质同时成立的数字；Uim 喜欢这至少符合其中一种性质的数字；八尾勇喜欢刚好有符合其中一个性质的数字；正妹喜欢不符合这两个性质的数字。 就是这个问题 谢谢啊

user: user-1
content: 把你的具体需求说一下，可以直接给你写一个可以实现的代码（用if else）  单从你的if ... else说明上来看是可以的，需要加大括号。大括号里的if else是一个整体，对于大括号外面的来讲
user-0 提问: gcc如何仅链接用到的函数，使程序体积尽量减小？

回复:
user: user-1
content: 引用 6 楼 六道佩恩 的回复:话说你这些是在哪里看到的？ 呵呵，以前做个相似的

user: user-1
content: gcc -Os -fdata-sections -ffunction-sections test.c -o test.exe -Wl,-gc-sections -Wl,-strip-all or gcc -Os -fdata-sections -ffunction-sections -Wl,-gc-sections -Wl,-strip-all test.c -o test.exe

user: user-1
content: GCC链接操作以section作为最小的处理单元，一个section中可以包含很多个function，而一个section中只要有一个function被引用，该section就会被加入链接，最终生成可执行文件。  换句话说就是，在缺省情况下，某个.c程序中的所有function，实际上都会编译成同一个section。那么，只要你的代码中用到这个.c生成的.o的其中任何一个function，系统就会将这整个section进行链接。这就导致，我们在引用外部静态库时，不管你是引用其中一个函数，还是引用全部的函数，你最终编译链接出来的可执行文件都一样大，系统并不会自动根据你所引用的函数个数的多少而动态的调整链接方式。  如果静态库是你自己生成的，采用两个步骤即可： 编译时：使用"-ffunction-sections"和"-fdata-sections"将每个function/data创建为一个sections，sections名与function/data名保持一致。 链接时：采用"-Wl, -gc-sections"，告诉系统去掉那些没用用到的section，则链接器ld不会链接未使用的函数，从而减小可执行文件大小。  如果静态库不是你自己生成的，试试--strip-all(貌似-gc-sections与--gc-sections都可以) gcc -Os -fdata-sections -ffunction-sections test.c -o test.elf -Wl,--gc-sections -Wl,--strip-all

user: user-0
content: 引用 5 楼 Intel0011 的回复:gcc -Os -fdata-sections -ffunction-sections test.c -o test.exe -Wl,-gc-sections -Wl,-strip-all or gcc -Os -fdata-sections -ffunction-sections -Wl,-gc-sections -Wl,-strip-all test.c -o test.exe 太牛了你！话说你这些是在哪里看到的？

user: user-0
content: 引用 2 楼 user-2 的回复:--gc-sections，gc前面是两个-，不过不一定能小多少，你ls比较一下 不识别这个参数呀。。。。。 我的gcc是Windows上的（mingw）

user: user-2
content: --gc-sections，gc前面是两个-，不过不一定能小多少，你ls比较一下

user: user-0
content: 忘说了，前提是静态库
user-0 提问: free函数

回复:
user: user-1
content: free需要和malloc/realloc成对出现，free是针对对上空间的释放，对于没在堆上申请空间的地址是不能释放的，否则可能会出现多错误～

user: user-2
content: 引用 3 楼 肥牛肉^*^ 的回复：[quote=引用 2 楼 user-5的回复:]malloc <-> free 一定是成对使用的。 Sequence st没有使用malloc，是放在栈上的，不需要自行去free 至于说结构体中包含了指针。那得看这个指针是怎么用的。 如果没有malloc空间，不需要free。 那让结构体里面的指针指向一个指针变量这样可以释放吗，就是int *p   int**a=p可以free（st）吗[/quote]数组和数组元素是两码事 数组不用free，数组元素如果是指针类型，并且申请了内存，就要释放数组元素，也就是释放free(st.a[i])是可以的

user: user-3
content: 引用 3 楼 肥牛肉^*^ 的回复:那让结构体里面的指针指向一个指针变量这样可以释放吗，就是int *p   int**a=p可以free（st）吗 你对成对使用这个词是怎么理解的

user: user-4
content: free 只针对堆地址，并不是所有的指针都需要free

user: user-0
content: 引用 2 楼 user-5的回复:malloc <-> free 一定是成对使用的。 Sequence st没有使用malloc，是放在栈上的，不需要自行去free 至于说结构体中包含了指针。那得看这个指针是怎么用的。 如果没有malloc空间，不需要free。 那让结构体里面的指针指向一个指针变量这样可以释放吗，就是int *p   int**a=p可以free（st）吗

user: user-5
content: malloc <-> free 一定是成对使用的。 Sequence st没有使用malloc，是放在栈上的，不需要自行去free 至于说结构体中包含了指针。那得看这个指针是怎么用的。 如果没有malloc空间，不需要free。

user: user-3
content: 没有动态分配就不用free
user-0 提问: 函数调用

回复:
user: user-0
content: 引用 1 楼 user-1的回复:return(arry[i]); 这一句相当于 return array[9],它的作用是什么呢？ 我懂了，谢谢

user: user-0
content: 引用 1 楼 user-1的回复:return(arry[i]); 这一句相当于 return array[9],它的作用是什么呢？ 可以不用这个吗，我小白，大佬

user: user-1
content: return(arry[i]); 这一句相当于 return array[9],它的作用是什么呢？
user-0 提问: 中序线索化二叉树算法使用顺序栈

回复:
user: user-1
content: StackInitiate函数的代码呢？ 看参数StackInitiate(&st)是二级指针，估计函数内部是动态分配内存（说明顺序栈的大小是动态的）。所以最后要释放内存。

user: user-2
content: 这个是一个伪代码。 释放的是栈 st的空间，StackInitiate(&st) 和 free(st) 对应。 栈内存储的只是指针，也没有对应的free。

user: user-3
content: 书写错  下一题
user-0 提问: 农夫过河问题

回复:
user: user-1
content: 类似于i+=1; i+=1; i=i+; ======= m<<=1; 相当于 m=m<<1;

user: user-0
content: 引用 1 楼 真相重于对错的回复:左移一位，相当于乘2 为什么还要加个等号，直接movers＜＜1这样可以吗

user: user-2
content: 这是位运算，<<是左移，>>是右移，是对二进制的操作 和一般运算符操作一样，比如+，+1表示加1，变量+=1就是变量+1的结果再赋给变量 同理，<<1表示左移1位，变量<<=1就是变量左移1位的结果再赋给变量 因为是二进制，所以左移1位相当于乘2，右移1位相当于除以2， 比如，移1个字节8位bit来举例，二进制00000001（十进制 1），左移1位变成00000010（十进制 2），高位舍弃低位补0，十进制从1变成2，相当于乘2。

user: user-1
content: 左移一位，相当于乘2
user-0 提问: 字符串处理的常用库函数

回复:
user: user-1
content: 使用  其他   字符串处理库函数 时   在  C源程序 中包含  头文件string.h  楼主的语文是体育老师教的。  老婆给当程序员的老公打电话：下班顺路买十个包子，如果看到卖西瓜的，买一个。当晚老公手捧一个包子进了家门…老婆怒道：你怎么只买一个包子?!老公甚恐，喃喃道：因为我真看到卖西瓜的了。

user: user-2
content: 就是在使用字符串处理函数时，需要包含头文件string.h，因为这个头文件里包含了字符串处理函数的声明，库函数实现在动态库里（这个不需要关心），只需要引入头文件就好了。

user: user-3
content: 你是学语文还是学编程？这句话在文法上其他的字符串处理函数和其他字符串处理的函数都说得通，但是如果你会编程，就不会问这种奇葩的问题。 就好比医学生不会对“变态反应”大惊小怪。

user: user-4
content: 纠正一下，字符串处理是函数的定语

user: user-4
content: 这是中文理解的歧义吗？ 其他字符串处理库函数 的正确理解是 其他字符串处理库函数   ，关键词就是其他函数，其他的什么函数呢？字符串处理函数 所以，不是其他字符串，是其他函数，字符串处理是函数的定于。  感觉想再教语文。。。
user-0 提问: Strassen算法代码：内存出错，求大佬指点，马上交报告了 

回复:
user: user-1
content: 引用 2 楼 Anthony.F.Young 的回复:救救孩子！！！（捞一下寄几）  1.建议free后，直接将指针置为NULL 否则如果重复释放，不好判定。 2. 不要在一行放多个语句，影响定位问题。  在出错的地方下断点看一下。 基本就是空指针或者溢出的问题

user: user-2
content: 释放空指针了吧， 怎么分配的内存空间啊， 去分配的地方仔细检查一下吧

user: user-0
content: 大佬们帮帮忙呀

user: user-0
content: 救救孩子！！！（捞一下寄几）

user: user-0
content: 楼主是上海某985大二学渣，算法课让实现矩阵规模非2的幂次下的strassen算法，搞来搞去好像都是内存方面的错误，烦请各位大佬帮我看看哪儿的问题
user-0 提问: 农夫过河问题

回复:
user: user-1
content: 0x开头是16进制，但是&运算没有规定必须用二进制啊，只是运算过程用二进制来运算 比如 int a = 5, b = 3; int c = a & b; //操作数都是10进制，5 是 101， 3 是 011，所以 5&3=101&011=001=1（十进制），运算过程用二进制，操作数没有规定必须用二进制，所以用16进制也没问题，运算过程把16进制转成2进制来运算。 16进制的0x08就是2进制的00001000，10进制是8，所以 location&0x08 和 location&8是一样的（十进制），location&1000就不对了，因为二进制不能直接表示，1000就是10进制的1000。

user: user-2
content: C语言没有你所说的二进制输入，最多可用函数去实现。 C语言本身支持的三种输入是： 1. 十进制。比如20,457； 2. 十六进制，以0x开头。比如0x7a； 3. 八进制，以0开头。比如05,0237

user: user-3
content: 二进制和十六进制有区别吗？
user-0 提问: 求大佬帮我看看这两种算法的优劣

回复:
user: user-1
content: 之所以说是理论上，是从出栈入栈的角度讨论的，实际上栈也是模拟的，root = stack[top--]; 或者直接 root = root->left; （不入栈）都是等效的 所以两个算法的时间复杂度和空间复杂度是一样的。

user: user-1
content: 理论上算法二优越一些。 因为算法二只有一个父节点入栈，而算法一是左右两个节点都入栈（虽然左节点入栈后马上在下一轮循环出栈，但也是多了一次入栈出栈的操作）
user-0 提问: 大佬们，这个冒泡排序还有什么问题？

回复:
user: user-1
content: i是不确定值，栈上的空间不像堆上的空间可以动态指定（申请），栈上的空间需要运行前指定。

user: user-0
content: 引用 3 楼 lin5161678的回复:i垃圾值 不能做数组大小 你想用输入做数组大小 得在输入语句后面这数组定义 并且你输入是n 应该用n 而不是i 万分感谢！！！

user: user-2
content: 引用 1 楼 user-3的回复:最好是把代码粘上来，截图看着太累。 int a[i]感觉应该是int a[n]，但理论上c语言是不支持这样声明数组的，数组的长度必须是一个确定的常量值。 定义数组长度可以是变量

user: user-2
content: i垃圾值 不能做数组大小 你想用输入做数组大小 得在输入语句后面这数组定义 并且你输入是n 应该用n 而不是i

user: user-0
content: 引用 1 楼 user-3的回复:最好是把代码粘上来，截图看着太累。 int a[i]感觉应该是int a[n]，但理论上c语言是不支持这样声明数组的，数组的长度必须是一个确定的常量值。 虽然改了a【i】，改用malloc后对了，但C99不是支持这样定义吗

user: user-3
content: 最好是把代码粘上来，截图看着太累。 int a[i]感觉应该是int a[n]，但理论上c语言是不支持这样声明数组的，数组的长度必须是一个确定的常量值。
user-0 提问: C语言|编译过了，但是测试集过不了，应该是文件读出有点问题

回复:
user: user-1
content: 现在知道怎末改了吗

user: user-2
content: 引用 2 楼 自信男孩 的回复:读写方式不对，读是用二进制，而写是用ascii。所以写入的内容，读出来的不一致。 建议用fscanf/fprintf或fread/fwrite进行读写

user: user-2
content: 读写方式不对，读是用二进制，而写是用ascii。所以写入的内容，读出来的不一致。

user: user-3
content: 题目呢
user-0 提问: 算第m个到第n个质数的和，为啥这个for循环程序算出来是错的？

回复:
user: user-1
content: #include <stdio.h> /* 1、注意缩进 {} 2、注意t=1和t==1的区别, t==1 3、注意初始化变量 sum=0 4、注意标志变量的刷新赋值 t=1 5、注意变量的初始值 cnt=m 6、注意不同的条件可能会产生副作用 for (x = 2; cnt < n; x++)--for (i = 2; i < x; i++) */ int main() {     int x = 0, m = 0, n = 0, sum = 0, t = 1;     int cnt = 0;     scanf("%d %d", &m, &n);     cnt = m;//从m开始，否则会从0开始的     if (m > 0 && m < n && m <= 200)     {         for (x = 2; cnt < n; x++)//m~n-1之间的质数，不包括n         {             int i = 0;             t = 1;//t=1要在这里重新赋值为1             for (i = 2; i < x; i++)//2会被过滤掉，但是刚好2也是质数             {                 if (x % i == 0)                 {                     t = 0;                     break;                 }             }             if (t == 1)//原来是“t=1”             {                 if (cnt >= m)                 {                     printf("%x\n",x);                     sum += x;                 }             }             cnt++;//cnt在这里加1         }         printf("%d\n", sum);     }//注意缩进     return 0; }

user: user-1
content: #include <stdio.h> #include <math.h> /* 计算第m个质数到第n个质数之间的和 1、先计算出质数 2、取对应的质数累加求和 */ int prime(int m ,int n) {     int index = 1;     int i = 0, j = 0;     int sum = (m==1?2:0);     for (i = 3;; i++)     {         for (j = 2; j <= sqrt(i); j++)         {             if (i % j == 0)             {                 break;             }         }         if (j > sqrt(i))         {             index++;             if (index >= m && index <= n)             {                 sum += i;             }             if (index >= n)             {                 break;             }         }     }     return sum; } int main() {     int m = 0, n = 0, sum = 0;     scanf("%d %d", &m, &n);     if (m > 0 && m < n && m <= 200)     {         sum=prime(m, n);         printf("%d\n", sum);     }     return 0; }

user: user-2
content: 参考一下吧  int main() {     int i, x, m, n, cnt=0, sum=0;     scanf("%d%d", &m, &n);     for (x=2; cnt<n; x+=(x==2?1:2)) {         for(i=3; i<=x/2; i+=2) {             if (x%i==0) break;         }         if (i>x/2) {             cnt++;             if (cnt>=m) {                 sum += x;             }         }     }     printf("%d\n", sum); }
user-0 提问: 求大佬帮我讲解这段代码

回复:
user: user-1
content: 所谓 万变不离其宗 链表一般是单节点对单节点的单向关系（当然也有双向关系，就是双向链表） 二叉树就是单节点对双节点的单向关系（所以单向关系就是父节点能找到子节点，但子节点不能找到父节点） 图就是多节点对多节点的多向关系 所以关系越复杂，就越不好理解。（感觉怎么和生活一样）

user: user-0
content: 十分感谢，我感觉二叉树代码好长，有点不好理解，但理解过后就发现其实二叉树就是链表，想想前面刚学链表时还挺轻松的，真让我郁闷

user: user-1
content: 其实说好理解也好理解，说不好理解也不好理解，前中后序只是打印的地方不同，遍历过程是相同的。 就像上次跟你说的，它的遍历过程就是先找到左子树的最右节点，然后让最右节点的右节点指向父节点，然后父节点的左子树继续遍历，当遍历到最右节点的右节点就会回到父节点（因为之前设置了最右节点的右节点指向父节点），然后恢复最右节点的右节点为NULL，并遍历父节点的右子树。 所以前中后序的差别上只是在于什么时候打印。  后序打印为什么会复杂呢？因为它要遍历到最右节点才开始打印（前序，中序在中间就打印），所以它要遍历到最右节点以后，才开始逆向打印之前的各层的节点。那么怎么逆向打印呢？想想还不简单吗？因为遍历到最右节点时，最右节点的右节点又回到了父节点，拿到父节点，就可以得到原来的父节点的左右节点。 所以addPath就是为了打印这个从最右节点开始逆向遍历的结果。 先顺着打印 res[(*returnSize)++] = root->val;  root = root->right;  再逆向重新排列结果 int t = res[i]; res[i] = res[j]; res[j] = t; 这里的逆序addPath可能用了技巧，只需要对半逆向，具体没太细研究，大体思路就是这样，所以后序需要找到最右才能开始打印，不像前序中序在遍历过程中就能打印，所以它比较繁琐。 这种技巧性的东西，我觉得没有必要研究得太深，意义不大，可能只是一开始惊叹一下这技巧不错，但是不能给其他问题带来什么新的启发，所以大概了解就可以了。

user: user-0
content: 大佬们，我发现二叉树的后序遍历的非递归代码相比前序遍历和中序遍历，很不好理解，有什么诀窍吗？
user-0 提问: 这个冒泡排序到底哪里出错？

回复:
user: user-0
content: 引用 1 楼 user-2的回复:你这哪是排序？ ii在循环中一直不变，a[j]一直和ii固定位置的元素a[ii]比较 感谢，我之前以为ii会一直等于i+1，听你回复懂了

user: user-0
content: 引用 2 楼 focuslight的回复:你那个 int a[i] 怎么没报错啊。 用常量声明数组啊 C99好像可以这样，不用malloc

user: user-1
content: 你那个 int a[i] 怎么没报错啊。 用常量声明数组啊

user: user-2
content: 你这哪是排序？ ii在循环中一直不变，a[j]一直和ii固定位置的元素a[ii]比较
user-0 提问: c语言

回复:
user: user-1
content: 对于实数的比较，一般写法 #define EPS 1e-7 .....  while(fabs(a)-20>=EPS);

user: user-2
content: 浮点数的比较不能像整形数那样比较.  https://blog.csdn.net/jk110333/article/details/8902707  供参考～

user: user-0
content: 谢谢！

user: user-3
content: 浮点数的精度原因致使浮点数不一定能准确存储表达一个数，所以不能用这种方式来比较， 可以用 a-20<一个精度范围 这样的方式来代替
user-0 提问: 这个代码没错吧，链表后面结点的值显示不出来？求大神帮忙

回复:
user: user-0
content: 引用 3 楼 编程且快乐的回复:这个是我帮你修改的代码（如果觉得可以请结题一下）： struct list *getlink(int b[], int b1) { 	struct list *s,*h; 	struct list *head = NULL; 	int i; 	for ( i = b1-1; i>=0; i--) 	{ 		h = (struct list *)malloc(sizeof(struct list));	 		h->data = b[i]; 		h->next = NULL; 		if (head == NULL){ 			head = h; 		} 		else 		{ 			s->next = h; 		} 		s = h; 	} 	return head; } 多谢帮忙，改过来了

user: user-0
content: 引用 1 楼 user-2的回复:if(h=NULL)  //错误在这一句，改成 if(h == NULL) 就正确了，条件判断写成赋值啦 h=s; 谢谢了，就错在赋值号上

user: user-1
content: 这个是我帮你修改的代码（如果觉得可以请结题一下）： struct list *getlink(int b[], int b1) { 	struct list *s,*h; 	struct list *head = NULL; 	int i; 	for ( i = b1-1; i>=0; i--) 	{ 		h = (struct list *)malloc(sizeof(struct list));	 		h->data = b[i]; 		h->next = NULL; 		if (head == NULL){ 			head = h; 		} 		else 		{ 			s->next = h; 		} 		s = h; 	} 	return head; }

user: user-1
content: 你这个代码在读取数据的时候错了，这个链表函数struct list* getlink(int b[],int b1);错误，重新写一个就好了，你这个函数只读了一个数据进去，因为你的链表指向不对

user: user-2
content: if(h=NULL)  //错误在这一句，改成 if(h == NULL) 就正确了，条件判断写成赋值啦 h=s;
user-0 提问: 求助free()问题

回复:
user: user-0
content: 懂了，谢谢。

user: user-1
content: 问题就在于删除的节点不是自己申请的内存，是指向main函数的z变量，z是不能free的（因为z的内存是程序自动分配的，不是自己申请的），只有自己malloc申请的内存才需要free。
user-0 提问: c语言为什么printf显示为定义标识符

回复:
user: user-1
content: printf( printf（ 不一样

user: user-0
content: 对的。。。。

user: user-2
content: 呵呵，用了中文括号了吧？

user: user-0
content: 我明白了 printf后面那个括号格式不对
user-0 提问: c语言，两个一元多项式相加，看看下面的代码哪里错了

回复:
user: user-1
content: #include<stdio.h>  static int num = 0;  void create(int array[100]) {     num++;     int moudulus, index, times = 1;     do {         printf("请输入第%d个多项式的第%d项的系数和指数（输入“0，0”以结束多项式的输入）：\n", num, times);         //scanf_s("%d,%d", &moudulus, &index);         scanf("%d,%d", &moudulus, &index);         if ((moudulus == 0 && index == 0) || (index < 0 || index > 100))             break;         array[index] = moudulus;         times++;     } while (times < 100);  }  void plus(int a[], int b[], int result[]) {     int i;     for (i = 0; i < 100; i++)     {         if (a[i] && b[i])             result[i] = a[i] + b[i];         if (a[i] == 0 && b[i])             result[i] = b[i];         if (a[i] && b[i] == 0)             result[i] = b[i];     } }  void print(int array[]) {     int i;     printf("这%d个多项式相加的结果为：\n", num);     //for (i = 99; i > 0; i--)     for (i = 0; i < 100; i++)     {         if (array[i] == 0)             continue;         if (array[i] < 0)             printf("-");          i == 0 ? printf("%d", array[i]) : printf("%dx^%d", array[i], i);         if (i+1 < 100 && array[i+1] > 0)             printf(" + ");     } }  int main() {     int a[100] = { 0 }, b[100] = { 0 }, result[100] = { 0 };     create(a);     create(b);     plus(a, b, result);     print(result);     return 0; }  供参考～

user: user-0
content: 这个可以编译，但运行很奇怪
user-0 提问: 刚学c，写了一个统计正数负数和0个数的程序，也就是杭电oj第2008题

回复:
user: user-1
content: scanf ("%d",n);  第二个参数应该是一个地址，因此应该用&n； 楼主既然对a的输入时对的，下面的对n时怎么就写错了呢

user: user-2
content: scanf(“%d”, n); 改成 scanf(“%d”, &n); //注意是&n
user-0 提问: 怎么读取经纬度数据文件进行车辆行驶里程的计算

回复:
user: user-1
content: 有些GPS里有经纬度，另外还有时间；可以根据这个来计算速度，但是这个只能计算直线距离和速度，如果有转弯，好像算出来的速度会有误差；  另外，每次读取的经纬度要确保是正确，需要楼主做好判断～

user: user-2
content: 设GPS的经纬度是个文件，不断读取，前后相邻的经纬度，然后使用公式求2个经纬度之间的距离，距离不断累积就是里程。 这个公式网上能找到，也比较精确。另外如果知道经纬度的记录频率，也能计算出瞬时速度，平均速度当然也可以算出来。 最重要的是前面提到的公式，有了时间，和距离，其他都是简单的数学题
user-0 提问: 这个赋值怎么出问题了？

回复:
user: user-1
content: 你可以 int a[5]; int *p =a; 单是你不可以 int *p=malloc(sizeof(int)*5); int a[5] ; a=p;

user: user-1
content: 指针不同于数组，指针如果没有明确初始化，他指向的是一个未知量 数组虽然可以转为指针，但是在定义它的时候就已经确定了存储位置。。 而指针则不同，你必须 xxx* x=malloc 或者 xxxx* x=&y; 方式来确定存在。

user: user-0
content: 引用 2 楼 user-2 的回复:分配内存不对，改成以下，自己对比一下区别 w=(qq*)malloc(sizeof(qq)); w->va = (TT*)malloc(5*sizeof(TT));   w = (qq*)malloc(len); //这里虽然多分配了内存，但是对于w->va来说还是没有分配内存，w->va还是野指针 memset加上，会导致w->va的内存信息为0，也就是w->va指向NULL，所以w->va[0].val = 5;会报空指针错误，也就是只能打印12 如果没加上memset，w->va的内存信息是随机的（也就是野指针），w->va[0].val = 5;往野指针（也就是非法内存地址）写入数据，会引起不可预知的错误，所以这次可能会打印出123，下次可能会打印出1234（也就是结果是随机的），但程序终究是非法访问别的内存，迟早会报错。  我咋感觉和柔性数组差不多呢？我想把首地址就赋给w，申请处连续的空间，这俩有啥不一样呢？

user: user-0
content: 这和柔性数组有什么区别？https://blog.csdn.net/tjw316248269/article/details/104791911 写成数组[]，也不相当于指针么？

user: user-2
content: 分配内存不对，改成以下，自己对比一下区别 w=(qq*)malloc(sizeof(qq)); w->va = (TT*)malloc(5*sizeof(TT));   w = (qq*)malloc(len); //这里虽然多分配了内存，但是对于w->va来说还是没有分配内存，w->va还是野指针 memset加上，会导致w->va的内存信息为0，也就是w->va指向NULL，所以w->va[0].val = 5;会报空指针错误，也就是只能打印12 如果没加上memset，w->va的内存信息是随机的（也就是野指针），w->va[0].val = 5;往野指针（也就是非法内存地址）写入数据，会引起不可预知的错误，所以这次可能会打印出123，下次可能会打印出1234（也就是结果是随机的），但程序终究是非法访问别的内存，迟早会报错。

user: user-1
content: 你的代码错误 typedef struct t2 {     TT *va; } qq; qq* w 你的w初始化了，但是w的va没有初始化，对他的访问是未定义行为。
user-0 提问: c语言数组长度

回复:
user: user-0
content: 引用 5 楼 qybao 的回复:[quote=引用 2 楼 m0_46244162 的回复：][quote=引用 1 楼 qybao 的回复:]没办法，只能自己控制 比如数组初始化每个元素为0，然后循环统计有几个非0的元素像是sizeof(s)/sizeof(s[0])这样子都不可以吗 那如果用户输入十几个数字 我要怎么知道这个长度呢 [/quote]没办法，你只能自己记录这个长度 很多数据结构用个length变量来自己统计，增加元素则length++，删除元素则length--[/quote]好的 谢谢大佬

user: user-1
content: 引用 2 楼 m0_46244162 的回复：[quote=引用 1 楼 qybao 的回复:]没办法，只能自己控制 比如数组初始化每个元素为0，然后循环统计有几个非0的元素像是sizeof(s)/sizeof(s[0])这样子都不可以吗 那如果用户输入十几个数字 我要怎么知道这个长度呢 [/quote]没办法，你只能自己记录这个长度 很多数据结构用个length变量来自己统计，增加元素则length++，删除元素则length--

user: user-2
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-2
content: 栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……  其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-0
content: 引用 1 楼 qybao 的回复:没办法，只能自己控制 比如数组初始化每个元素为0，然后循环统计有几个非0的元素像是sizeof(s)/sizeof(s[0])这样子都不可以吗 那如果用户输入十几个数字 我要怎么知道这个长度呢

user: user-1
content: 没办法，只能自己控制 比如数组初始化每个元素为0，然后循环统计有几个非0的元素
user-0 提问: C风格字符串连接问题求解：

回复:
user: user-0
content: 引用 1 楼 user-1的回复:首先 得有足够大的缓冲区存数据 然后  strcat(a, strcat(b, c)); 谢谢大佬，已结帖

user: user-1
content: 首先 得有足够大的缓冲区存数据 然后  strcat(a, strcat(b, c));
user-0 提问: HALCON导出C#,if (HDevWindowStack.IsOpen()) 这个判断语句条件无法成立为什么？

回复:
user: user-1
content: 注意到HDevWindowStack是一个栈，所以需要用相应的Push函数把想要用到的窗口的句柄压到栈里面去，isopen()才能返回非零值

user: user-0
content: 导出后类似一下语句都套上了一个IF条件，要怎么把这个窗口打开                                            if (HDevWindowStack.IsOpen())                     {                         HOperatorSet.DispObj(ho_Image0, HDevWindowStack.GetActive());                     }                     if (HDevWindowStack.IsOpen())                     {                         HOperatorSet.SetDraw(HDevWindowStack.GetActive(), "fill");                     }
user-0 提问: 请问一下这个题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:256M=2^10*2^10*2^8=2^28 MAR是内存地址寄存器（Memory Address Register），用于存储主存的地址信息，主存只有256M，也就是只需要28位即可储存所有地址，所以MAR是28位  嗯，谢谢大佬，我明白了

user: user-1
content: 256M=2^10*2^10*2^8=2^28 MAR是内存地址寄存器（Memory Address Register），用于存储主存的地址信息，主存只有256M，也就是只需要28位即可储存所有地址，所以MAR是28位
user-0 提问: 输出的字符数组后面为什么会有乱码?请求大神帮忙

回复:
user: user-0
content: 引用 1 楼 user-1的回复:for(j=0;s[j]!='\0';j++) //字符串结束符没有被赋给a，因为s[j]=='\0'时退出for了 { a[j]=s[j]; s[j]='\0';  } a[j]='\0'; //所以这里加个字符串结束符 谢谢帮忙，弄好了

user: user-1
content: for(j=0;s[j]!='\0';j++) //字符串结束符没有被赋给a，因为s[j]=='\0'时退出for了 { a[j]=s[j]; s[j]='\0';  } a[j]='\0'; //所以这里加个字符串结束符
user-0 提问: 'int'  followed  by   'void'  is illegal  求大佬帮忙解答

回复:
user: user-1
content: 可以像写文字那样，直接赋值粘贴～

user: user-0
content: 引用 3 楼 自信男孩的回复:建议直接贴代码吧～ 怎么贴，不懂啊，大佬

user: user-0
content: 引用 1 楼 user-3的回复:看提示，估计是出现了 void int xxx 的代码，语法错误 我直接粘贴老师讲的，然后就错了，刚学。

user: user-0
content: 引用 2 楼 lin5161678的回复:代码呢 啥代码c2632?

user: user-1
content: 建议直接贴代码吧～

user: user-2
content: 代码呢

user: user-3
content: 看提示，估计是出现了 void int xxx 的代码，语法错误
user-0 提问: c语言字符串问题

回复:
user: user-1
content: 引用 3 楼 m0_46244162 的回复：[quote=引用 1 楼 qybao的回复:]scanf_s(“%s”, s, 29); //因为最后一个是字符串结束符，所以字符串长度只能是29 请问如果我前面宏定义了一个#define LENGTH 30 我后面这个scanf_s（"%s",s,LENGTH-1）; 是要这么写就可以吗[/quote]这么写可以。 要不然你就定义数组为 char s[LENGTH+1];

user: user-0
content: 引用 1 楼 qybao的回复:scanf_s(“%s”, s, 29); //因为最后一个是字符串结束符，所以字符串长度只能是29 请问如果我前面宏定义了一个#define LENGTH 30 我后面这个scanf_s（"%s",s,LENGTH-1）; 是要这么写就可以吗

user: user-1
content: scanf_s(“%s”, s, 29); //因为最后一个是字符串结束符，所以字符串长度只能是29

user: user-2
content: 建议楼主贴出错误，并贴出测试用例的数据来。
user-0 提问: c语言字符串

回复:
user: user-0
content: 引用 5 楼 棉猴 的回复:把保存字符串的数组首先都初始化为'\0'怎么都先初始化？ s[len]={0};这样吗

user: user-1
content: 把保存字符串的数组首先都初始化为'\0'

user: user-2
content: 只能檢查，無法確保。發現結尾不是0就返回。

user: user-3
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-4
content: 引用 6 楼 m0_46244162 的回复:引用 5 楼 棉猴 的回复:把保存字符串的数组首先都初始化为'\0'怎么都先初始化？ s[len]={0};这样吗 初始化也没法确保最后一定是\0啊，这就是C的特点。

user: user-5
content: 怎么确保就是软件开发的问题，传入前就要确定至少最后一个可以装0

user: user-6
content: 啥意思？那你要加个字符串长度参数才可以，然后判断 s[len]==‘\0’ 是否成立（假设s是传入的字符指针，len是传入的字符串长度）

user: user-3
content: 限制最大长度，超过最大长度，自动在最后加'\0'
user-0 提问: 这里的这三个警告是怎么回事

回复:
user: user-1
content: struct seat** vseat = (struct seat**)malloc(valid * sizeof(struct seat*));

user: user-0
content: 引用 1 楼 user-2 的回复：struct seat** vseat = (struct seat**)malloc(valid*sizeof(seat*));//这里要用sizeof(seat*)谢谢大佬，但是警告更多了

user: user-2
content: struct seat** vseat = (struct seat**)malloc(valid*sizeof(seat*));//这里要用sizeof(seat*)
user-0 提问: 用链表实现通讯录 为什么他只能执行到输入地址下面不执行了

回复:
user: user-1
content: 引用 3 楼 绪风.的回复:[quote=引用 1 楼 user-1的回复:]你所谓的输入地址后就不执行了是什么意思？ 输入的什么？ 之后不执行了什么意思？ 我运行你的程序，是正常的啊  唔我用devc＋＋ 他只能运行到联系人地址那 然后输入后运行窗口就关闭了是编译器的问题嘛[/quote] 有可能吧  但是代码看起来没有问题

user: user-0
content: 引用 1 楼 user-1的回复:你所谓的输入地址后就不执行了是什么意思？ 输入的什么？ 之后不执行了什么意思？ 我运行你的程序，是正常的啊  唔我用devc＋＋ 他只能运行到联系人地址那 然后输入后运行窗口就关闭了是编译器的问题嘛

user: user-0
content: 引用 1 楼 user-1的回复:你所谓的输入地址后就不执行了是什么意思？ 输入的什么？ 之后不执行了什么意思？ 我运行你的程序，是正常的啊  哎我我用devc＋＋他只显示到联系人地址那就运行窗口关闭了

user: user-1
content: 你所谓的输入地址后就不执行了是什么意思？ 输入的什么？ 之后不执行了什么意思？ 我运行你的程序，是正常的啊
user-0 提问: 萌新求教；这怎么错了？

回复:
user: user-1
content: 你的代码只能输入输出1个样例，而题目要求多个样例 改成 while(scanf(“%d”, &n)==1) {     //把你的第一行for开始到printf的代码放在这里 } 如果题目要求最后统一输出，那就把sum改成数组。每行计算结果存入sum数组对应的元素，最后循环打印sum数组。
user-0 提问: C语言

回复:
user: user-0
content: 引用 5 楼 自信男孩的回复:函数要遵循先定义后使用的原则～这个错误应该是编译器默认给你声明了，但是声明的时候默认的返回值是int，然后下面的定义是void类型，因此提示如上的错误～ 嗯嗯，好的，谢谢啦！

user: user-1
content: 函数要遵循先定义后使用的原则～这个错误应该是编译器默认给你声明了，但是声明的时候默认的返回值是int，然后下面的定义是void类型，因此提示如上的错误～

user: user-0
content: 引用 2 楼 qybao的回复:在int main(void)的前面追加 void my_strcpy(char *ch, char *dest); //加个函数声明 嗯嗯，好的，我试试，当初我就记得应该有三个void的

user: user-0
content: 引用 1 楼 user-3的回复:将自定义函数的定义放在main函数之前即可 也可以将自定义函数的声明放在main函数之前 好的好的多谢，已解决

user: user-2
content: 在int main(void)的前面追加 void my_strcpy(char *ch, char *dest); //加个函数声明

user: user-3
content: 将自定义函数的定义放在main函数之前即可 也可以将自定义函数的声明放在main函数之前
user-0 提问: 求助，哪位高手能告诉我一下这道填空题应该怎么做？

回复:
user: user-1
content: #include <stdio.h> #include <math.h>  double func(void);  int main(void) {     printf("%lf\n", func());     return 0; }   double func(void) {     double sum = 1.0, temp = 1.0;     int i = 1, tab = -1;      while (fabs(temp) > 1e-5) {         temp = tab * 1.0 / (2 * i + 1);         i++;         tab = tab * (-1);         sum = sum + temp;     }      return sum * 4; } 供参考～
user-0 提问: 指针问题

回复:
user: user-1
content: printf(“%s %c\n”, p, *p); //p是地址，%c是字符，两者不是同一类型，*p才是才是首字母字符。注意p与*p的区别。

user: user-0
content: 明白了，道理一说就清楚了。感谢

user: user-1
content: 这是打印格式的区别，打印函数对不同格式做不同的转换处理。 %s是以字符形式（参照ascii码）打印首地址开始，‘\0’结束的内存信息，所以它需要一个首地址作为参数，所以传入p是可以的，‘\0’结束符会自动推算。 %c是打印一个字符，需要的参数是字符（ascii码信息）而不是地址，所以p不可以，*p才是地址所存的ascii码信息。

user: user-0
content: p是地址我知道，为什么%s能识别，而%c不能
user-0 提问: 求kmp算法中的next函数解析

回复:
user: user-1
content: 以前回答过同样的问题了，lz自己参考吧 https://bbs.csdn.net/topics/397305194  lz这里设定T从1位置开始存储字符的，所以i从1开始，j从0开始 上述链接的字符串从0位置开始存储的，所以i从0开始，j从-1开始 以上是lz的代码和链接的区别，但思路和算法是一样的，所以理解链接的内容，应该也能理解lz的代码了。

user: user-1
content: 引用 3 楼 肥牛肉^*^ 的回复：[quote=引用 2 楼 肥牛肉^*^的回复:]遇到不匹配的就回溯到前一个字符吗 然后又不匹配就i不变，j又回溯到前一个是这样子吗[/quote]遇到不匹配就回退到上一次匹配的长度的位置，即j=next[j] 链接里有举例说明的呀。

user: user-0
content: 引用 2 楼 肥牛肉^*^的回复:遇到不匹配的就回溯到前一个字符吗 然后又不匹配就i不变，j又回溯到前一个是这样子吗

user: user-0
content: 遇到不匹配的就回溯到前一个字符吗
user-0 提问: 求助用c语言编写下面的ti

回复:
user: user-1
content: 这个应该是不难，就是比较两个数组的元素，先弄明白并集和交集的含义。 比如交集，那么可以先定义第三个数组，比如用malloc/free申请第三个数组，这个数组的长度可以用两个数组的较小长度作为第三个数组的长度 然后逐一比较满足条件的放到第三数组里。 并集也一样，第三个数组的长度就用两个数组的较长的数组长度。

user: user-2
content: 引用 3 楼 5250的回复:要学会思考 给个思路 建立一个数组 把所有的数字当作索引放在对应的位置，如果已存在，就加1 并集 输出所有索引位置的值不为空的索引 交集 输出该索引处值为2的索引 数字当索引适用固定取值范围的题目 这个题目没做限制的话 很难使用

user: user-3
content: 要学会思考 给个思路 建立一个数组 把所有的数字当作索引放在对应的位置，如果已存在，就加1 并集 输出所有索引位置的值不为空的索引 交集 输出该索引处值为2的索引

user: user-2
content: 作业自己做  别想抄 伸手党

user: user-2
content: 引用 6 楼 5250的回复:[quote=引用 4 楼 lin5161678 的回复:][quote=引用 3 楼 5250的回复:]要学会思考 给个思路 建立一个数组 把所有的数字当作索引放在对应的位置，如果已存在，就加1 并集 输出所有索引位置的值不为空的索引 交集 输出该索引处值为2的索引 数字当索引适用固定取值范围的题目 这个题目没做限制的话 很难使用[/quote]  题目都明确了这两个数组的取值了[/quote] 只考虑这两个数组 何不直接硬编码答案输出完事

user: user-4
content: 对于有限并且情况不多的问题，考虑穷举法是一种科学的方向。  所以看了下题目建议穷举结果 并 打印答案

user: user-3
content: 引用 4 楼 lin5161678 的回复:[quote=引用 3 楼 5250的回复:]要学会思考 给个思路 建立一个数组 把所有的数字当作索引放在对应的位置，如果已存在，就加1 并集 输出所有索引位置的值不为空的索引 交集 输出该索引处值为2的索引 数字当索引适用固定取值范围的题目 这个题目没做限制的话 很难使用[/quote]  题目都明确了这两个数组的取值了
user-0 提问: 测试各种变量赋值8进制16进制常量

回复:
user: user-1
content: iostream是C++的头文件  你C程序编译时候调用的gcc肯定找不到头文件啊   把文件后缀改为CPP

user: user-2
content: scanf的双引号限制的太多了，后面的两个&a, &b放在外面； scanf ("%x %x", &a, &b);  可以试一下～
user-0 提问: OpenCV  0x00007FFF91E93B29 处引发的异常: Microsoft C++ 异常

回复:
user: user-0
content: 引用 2 楼 toyjis 的回复：请问解决了吗，我也是这个问题！！并没有呢。。

user: user-1
content: 请问解决了吗，我也是这个问题！！

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

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

user: user-1
content: #include <stdio.h> #define P 3.14 int main(void) {     double r ;     printf("Input r:");     //scanf_s("%1f",&r);     scanf_s("%lf",&r);     printf("circumference=%f\n", 2 * P * r);     printf("area=%f\n", r * r * P);     return 0; } 是l不是1(一），%lf替换%1f
user-0 提问: 为什么我的构建程序的时候会提示我添加“；”“，”或“）”？

回复:
user: user-1
content: 引用 9 楼 weixin_50522399 的回复：[quote=引用 8 楼 Cunyuliuyun 的回复:][quote=引用 5 楼 自信男孩 的回复：]建议楼主确认一下自己的编译器，是C还是C++。形参前加&是C++的语法规则。可以试着应*代替&  看到楼主里面有cout<<这个也是C++的输出语法，因此建议楼主在C++编译器上编译这个代码；  代码是抄的吧，有几个问题需要改一下的。  //typedef ElemType; typedef int ElemType;  //return OK return OK;我们老师让我们用VC写，但是VC我创建source文件之后默认是cpp格式的我也没啥办法[/quote] VC里面创建C++代码 本来就该是cpp作为后缀，这有什么问题？[/quote]还是说我没找到

user: user-1
content: 引用 9 楼 weixin_50522399 的回复：[quote=引用 8 楼 Cunyuliuyun 的回复:][quote=引用 5 楼 自信男孩 的回复：]建议楼主确认一下自己的编译器，是C还是C++。形参前加&是C++的语法规则。可以试着应*代替&  看到楼主里面有cout<<这个也是C++的输出语法，因此建议楼主在C++编译器上编译这个代码；  代码是抄的吧，有几个问题需要改一下的。  //typedef ElemType; typedef int ElemType;  //return OK return OK;我们老师让我们用VC写，但是VC我创建source文件之后默认是cpp格式的我也没啥办法[/quote] VC里面创建C++代码 本来就该是cpp作为后缀，这有什么问题？[/quote]但是我们教材是C的，而且VC也没有构建C文件的选项啊

user: user-2
content: 引用 8 楼 Cunyuliuyun 的回复:[quote=引用 5 楼 自信男孩 的回复：]建议楼主确认一下自己的编译器，是C还是C++。形参前加&是C++的语法规则。可以试着应*代替&  看到楼主里面有cout<<这个也是C++的输出语法，因此建议楼主在C++编译器上编译这个代码；  代码是抄的吧，有几个问题需要改一下的。  //typedef ElemType; typedef int ElemType;  //return OK return OK;我们老师让我们用VC写，但是VC我创建source文件之后默认是cpp格式的我也没啥办法[/quote] VC里面创建C++代码 本来就该是cpp作为后缀，这有什么问题？

user: user-1
content: 引用 5 楼 自信男孩 的回复：建议楼主确认一下自己的编译器，是C还是C++。形参前加&是C++的语法规则。可以试着应*代替&  看到楼主里面有cout<<这个也是C++的输出语法，因此建议楼主在C++编译器上编译这个代码；  代码是抄的吧，有几个问题需要改一下的。  //typedef ElemType; typedef int ElemType;  //return OK return OK;我们老师让我们用VC写，但是VC我创建source文件之后默认是cpp格式的我也没啥办法

user: user-1
content: 明白了，不过我重新创建一个VC的工程，把代码复制过去之后，就没有这个问题了。。。。 不过还是非常感谢您的解答

user: user-3
content: 引用 1 楼 user-6 的回复:估计是c不支持引用类型（c++才支持） Status InitList(SqList &L) //改成指针类型，SqList *L  他这估计是想写C++代码，混入了C而已    cout<<endl; 里面有这句 但是没有namespace，错误太多了

user: user-4
content: 建议楼主确认一下自己的编译器，是C还是C++。形参前加&是C++的语法规则。可以试着应*代替&  看到楼主里面有cout<<这个也是C++的输出语法，因此建议楼主在C++编译器上编译这个代码；  代码是抄的吧，有几个问题需要改一下的。  //typedef ElemType; typedef int ElemType;  //return OK return OK;

user: user-5
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-3
content: error: expected ';', ',' or ')' before '&' token 这个错误一般是在你某行遗忘了;或者)时的报错

user: user-3
content: 你的编译错误太多啦 建议根据IDE的错误提示逐行排查

user: user-6
content: 估计是c不支持引用类型（c++才支持） Status InitList(SqList &L) //改成指针类型，SqList *L
user-0 提问: LeetCode 9 回文数

回复:
user: user-1
content: 楼主可以用字符串表示这个数，然后以字符串的中间为分界线，首尾一次比较，都相同表示是回文数，这样不用被数据表示的长度限制

user: user-2
content: 引用 5 楼 欧阳子遥 的回复:谢谢解惑，这个是LeetCode的第9题，其实判断这个溢出，我受到了LeetCode第七题的影响了，昨晚做的时候我跑不过就用了long int。但是后来改的时候，我改成>=之后，跑过了，也明白反转之后会溢出，但是我就不太理解>=2147483647，就可以跑过。>2147483647跑不过，那2147483646反转之后也溢出了，这就感觉有点怪异了。不过，看你的回答之后，我想我之前那种就是不正常的思路。我是根据它的编译器报错改的 不是跟你说了吗？>2147483647跑不过，是因为 >2147483647 就变成负数了，所有不会出现满足 >2147483647 的情况。而>=2147483647，其实只有=能满足情况，所以才说其实用 ==2147483647 就可以了。 至于 2147483646 的回文会溢出，那也不影响判断结果 temp == result，因为溢出了，result就会变成负数，所以 temp == result 是不会成立的。

user: user-3
content: 引用 5 楼 欧阳子遥 的回复:[quote=引用 4 楼 user-3的回复:]顺便最好把题目链接也贴出来 找题目方便点 谢谢解惑，这个是LeetCode的第9题，其实判断这个溢出，我受到了LeetCode第七题的影响了，昨晚做的时候我跑不过就用了long int。但是后来改的时候，我改成>=之后，跑过了，也明白反转之后会溢出，但是我就不太理解>=2147483647，就可以跑过。>2147483647跑不过，那2147483646反转之后也溢出了，这就感觉有点怪异了。不过，看你的回答之后，我想我之前那种就是不正常的思路。我是根据它的编译器报错改的[/quote] 我提交代码试过 小于0 这个判断有作用 大于等于最大值这个判断有或者没有都行 而且 int > int最大值 这样的判断是永远不成立的 注意存中间结果的变量能存下转换结果就可以了 比如用long long

user: user-0
content: 引用 4 楼 user-3的回复:顺便最好把题目链接也贴出来 找题目方便点 谢谢解惑，这个是LeetCode的第9题，其实判断这个溢出，我受到了LeetCode第七题的影响了，昨晚做的时候我跑不过就用了long int。但是后来改的时候，我改成>=之后，跑过了，也明白反转之后会溢出，但是我就不太理解>=2147483647，就可以跑过。>2147483647跑不过，那2147483646反转之后也溢出了，这就感觉有点怪异了。不过，看你的回答之后，我想我之前那种就是不正常的思路。我是根据它的编译器报错改的😂

user: user-3
content: 顺便最好把题目链接也贴出来 找题目方便点

user: user-3
content: 引用 2 楼 欧阳子遥 的回复:你好，我还是不理解为什么x不能等于2147483647，int型不是-2147483648到2147483647吗？上下限都可以取到呀，要晕了 因为上限值本身不是回文 既然不是回文 return false; 完全合理呀  所以你就会发现  是的这完全是多余的判断 有和没有都不会影响结果 卖萌的  另外按照你的算法 溢出是必然的 和你有没有判断最大值没关系  2147483646 不是最大值 逆序是 6463847421 当然溢出了  用long long 能存下6463847421 当然就不会溢出了

user: user-0
content: 引用 1 楼 qybao的回复:因为上限值本身不是回文，而且int是有符号的，一旦超过了上限就会变为负数，所以不存在超过上限的情况（其实应该用x==2147483647）。 改成long int可以，是因为long int的范围比int大，可以超过2147483647，此时判断条件就应该改 成x==long int的上限而不是2147483647。 你好，我还是不理解为什么x不能等于2147483647，int型不是-2147483648到2147483647吗？上下限都可以取到呀，要晕了

user: user-1
content: 引用 9 楼 欧阳子遥 的回复:[quote=引用 8 楼 自信男孩的回复:]楼主可以用字符串表示这个数，然后以字符串的中间为分界线，首尾一次比较，都相同表示是回文数，这样不用被数据表示的长度限制 谢谢指教，思考了一下，有点像双指针的感觉。一个前，一个后，比较相等之后前+1，后-1。[/quote] 恩，可以用双指针，比如start, end来操作。当然也可以用下表前后比较。其实道理都是一样的

user: user-0
content: 引用 8 楼 自信男孩的回复:楼主可以用字符串表示这个数，然后以字符串的中间为分界线，首尾一次比较，都相同表示是回文数，这样不用被数据表示的长度限制 谢谢指教，思考了一下，有点像双指针的感觉。一个前，一个后，比较相等之后前+1，后-1。

user: user-2
content: 因为上限值本身不是回文，而且int是有符号的，一旦超过了上限就会变为负数，所以不存在超过上限的情况（其实应该用x==2147483647）。 改成long int可以，是因为long int的范围比int大，可以超过2147483647，此时判断条件就应该改 成x==long int的上限而不是2147483647。
user-0 提问: 求助大佬们

回复:
user: user-1
content: have a try if (Char.IsDigit(e.KeyChar) || e.KeyChar.Equals('\r') || e.KeyChar.Equals('\b'))

user: user-0
content: 这个呢，或者运算符不对啊

user: user-2
content: 这个是C#吧。。。

user: user-1
content: 是OK，注意是全部大写。
user-0 提问: C语言结构体定义数组赋值为什么不对

回复:
user: user-0
content: 引用 3 楼 5250的回复:没有问题啊 我试过了 你用的什么IDE，怎么输入的 用的vs，是输入法用错了，谢谢回答~

user: user-0
content: 引用 2 楼 冷风1023的回复:我试了没有问题啊，你输入是怎么输入的？ 输入应该是“1，2，3”类似这样 我输错了，之前用了中文输入法，现在没问题了谢谢~

user: user-0
content: 引用 1 楼 自信男孩的回复:楼主输入的时候是不是格式不对呢 因为楼主的scanf_s中格式每次输入数字值之后要输入一个逗号，也注意下这个逗号是中文还是英文也要和scanf_s中的逗号保持一致。 再试一下吧 谢谢谢谢！我用了英文输入，运行成功了

user: user-1
content: result = scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1, &wc, 1, s, 81, ws, 81 ); scanf_s用法和scanf不一样，是要带字节长度的。

user: user-2
content: 没有问题啊 我试过了 你用的什么IDE，怎么输入的

user: user-1
content: 我试了没有问题啊，你输入是怎么输入的？ 输入应该是“1，2，3”类似这样

user: user-3
content: 楼主输入的时候是不是格式不对呢 因为楼主的scanf_s中格式每次输入数字值之后要输入一个逗号，也注意下这个逗号是中文还是英文也要和scanf_s中的逗号保持一致。 再试一下吧
user-0 提问: 指针到底啥时候需要malloc，什么时候不需要？

回复:
user: user-1
content: void func(char *pValue) { 	char *p = NULL;		//此时p未指向任何有效内存 	p = pValue;			//指针p指向pValue的地址，p和pValue指向同一块内存空间，此时改变p指向的内存存储的数据亦是改变pValue指向的地址存储的数据 	p = (char *)malloc(sizeof(char));	//此时指针p指向新申请的这块内存 	//当你额外需要一块新的内存空间的时候就需要malloc，或者是需要的内存空间很大（比如当我申请1024*100这么大的数组是，我电脑就会提示栈溢出） }

user: user-2
content: 栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……  其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-3
content: c++的话貌似至少有3点需要堆内存 1、不知道需要的对象的具体类型 2、不知道需要分配多少个对象 3、需要在类对象之间共享数据

user: user-4
content: 栈上的内存不需要malloc，就是你在函数中定义的变量（不考虑static情况），他们都对应一块栈内存，这些内存都有地址，也就都可以用指针来指 堆上的内存需要malloc，且必须malloc（或类似接口）才能使用，这个时候指针是必须要的，要不你就没办法操作这个内存了 栈上的内存是系统自动分配的，堆上的内存是程序员自己分配的，建议了解一下系统运行的内存布局，对理解指针有很大帮助的

user: user-2
content: 引用 6 楼 ggglivw 的回复:[quote=引用 4 楼 赵4老师 的回复:]住址到底啥时候需要盖房，什么时候不需要？  我类似的回答被论坛管理员删除了，原因是灌水。赵老师的这个回复会被删除不[/quote] 世上本来没有被删帖帝，被删得多了，也就有了被删帖帝。

user: user-5
content: 指针和malloc没有必然联系，指针就像门牌号码，门牌号码只有挂在存在房子上才有意义，如果这个房子不存在那你就要造个房子（malloc），然后把门牌号码（指针）挂上去。

user: user-6
content: 引用 4 楼 赵4老师 的回复:住址到底啥时候需要盖房，什么时候不需要？  我类似的回答被论坛管理员删除了，原因是灌水。赵老师的这个回复会被删除不

user: user-7
content: 要看指针指向的内容是否是可以读写的，一般指针不初始化它的指向是随机的，因为它（指针变量）里面存放的是一个随机值，因此指向的内容是随机的，既然是随机的，那么可能指向的地址是不可以读写的，所以可能会出现段错误，这个很常见； 如果此时我们给他一个可以读写的地址，比如通过malloc的返回值，返回的地址是堆上的，是可以读写的。 还有一个比如char *pstr, str[32]; pstr = str;此时是把str的地址值赋值给了pstr，str可能是栈上的，也可能是数据段上的，都是可以读写的。 因此需要给指针指向一个可以读写的区域，不论是malloc，还是栈上，数据段的都是可以的，道理都是一样的。  还比如:int *p, a; p = &a;解释和上面的char *pstr是一样的。

user: user-2
content: 住址到底啥时候需要盖房，什么时候不需要？

user: user-8
content: 简单来说，大空间变量

user: user-9
content: 自己申请内存的时候需要，指向已分配好的内存则不需要。 比如 char ch[16]; char *p1, *p2; p1 = ch; //不需要malloc，因为ch的内存已分配好 p1 = (char*)malloc(32); //需要malloc，因为这块内存事先没有分配，是自己申请的 p2 = p1; //不需要malloc，因为p1已分配好内存

user: user-10
content: 数组分为动态数组和静态数组 静态数组就是你分配前直到要分配的长度，即char str[20],这时候可以用一个指针指向他 char *p=str 另外一种 你的数组的长度是不确定的，比如你要输出一个不确定的数N来决定要分配的长度，这个时候不能直接char str[N],某些编译器会报错， 这个时候就用到动态数组了，即char *p = (char *)malloc(sizeof(N)).  malloc的空间在使用结束后必须手动释放，即free(p)。char *p=arr这种不需要释放空间，函数结束后自动释放
user-0 提问: 求大佬  最优解

回复:
user: user-1
content: #include<stdio.h>   const char *weekday[] = {"天", "一", "二", "三", "四", "五", "六"}; int main() {     int day, week, next;      while(1)     {         printf("今天星期几\n");         scanf("%d",&day);         if (day > 0 && day < 7)             break;         printf("请输入正确的工作日！\n");     }     printf("你想知道哪一天\n");     scanf("%d", &next);      if (next + day > 7)         week = (next + day) / 7;     else         week = 0;     day = (next + day) % 7;      if (week)         printf("%d天后是%d周后的星期%s\n", next, week, weekday[day]);     else         printf("%d天后是星期%s\n", next, weekday[day]);      return 0; }  供参考～  这种算法也是可以的。建议楼主测试一下自己的程序，比如输入如下值： 5 2 或 3 4

user: user-2
content: #include <stdio.h> static char* week_days[] = {"一", "二", "三", "四", "五", "六", "日"}; int main() {     printf("请输入今天的星期:\n");     int today = 1;     scanf("%d", &today);     printf("输入天数:");     int days = 0;     scanf("%d", &days);     int mol = (today + days) % 7;     printf("%d天后是星期%s", days, week_days[mol-1]);     return 0; }

user: user-1
content: 引用 3 楼 weixin_44382508 的回复:[quote=引用 2 楼 自信男孩的回复:]#include<stdio.h>   const char *weekday[] = {"天", "一", "二", "三", "四", "五", "六"}; int main() {     int day, week, next;      while(1)     {         printf("今天星期几\n");         scanf("%d",&day);         if (day > 0 && day < 7)             break;         printf("请输入正确的工作日！\n");     }     printf("你想知道哪一天\n");     scanf("%d", &next);      if (next + day > 7)         week = (next + day) / 7;     else         week = 0;     day = (next + day) % 7;      if (week)         printf("%d天后是%d周后的星期%s\n", next, week, weekday[day]);     else         printf("%d天后是星期%s\n", next, weekday[day]);      return 0; }  供参考～  这种算法也是可以的。建议楼主测试一下自己的程序，比如输入如下值： 5 2 或 3 4 谢谢您的回复，但我输入2 5或者3 4我没发现什么错误，还请您指教[/quote] 楼主的代码当输入这些数据时，似乎得到了星期0，不过我调试中出现的，不很确定了。你可以试一下～

user: user-0
content: 引用 2 楼 自信男孩的回复:#include<stdio.h>   const char *weekday[] = {"天", "一", "二", "三", "四", "五", "六"}; int main() {     int day, week, next;      while(1)     {         printf("今天星期几\n");         scanf("%d",&day);         if (day > 0 && day < 7)             break;         printf("请输入正确的工作日！\n");     }     printf("你想知道哪一天\n");     scanf("%d", &next);      if (next + day > 7)         week = (next + day) / 7;     else         week = 0;     day = (next + day) % 7;      if (week)         printf("%d天后是%d周后的星期%s\n", next, week, weekday[day]);     else         printf("%d天后是星期%s\n", next, weekday[day]);      return 0; }  供参考～  这种算法也是可以的。建议楼主测试一下自己的程序，比如输入如下值： 5 2 或 3 4 谢谢您的回复，但我输入2 5或者3 4我没发现什么错误，还请您指教
user-0 提问: 相同代码在vscode 和在vs上面运行结果不一致

回复:
user: user-1
content: 同样的问题，楼主搞懂了吗，是因为编译器不一样？

user: user-2
content: 这就是复制消除，少一次复制。

user: user-0
content: 引用 5 楼 真相重于对错 的回复:NRVO 复制消除了 vs2015以上 deubug 不支持 ,release 支持  为啥p1和p2两个对象的存储空间会一样，不应该是不同的吗？

user: user-2
content: NRVO 复制消除了 vs2015以上 deubug 不支持 ,release 支持

user: user-0
content: 引用 3 楼 赵4老师 的回复:设置生成release版再试试？ GCC是release版本

user: user-3
content: 设置生成release版再试试？

user: user-0
content: 想知道vscode上运行的代码为啥会出现这样的问题，感谢大佬解答

user: user-0
content: vscode  的结果： person默认构造函数的调用 0x22fe0c 0x22fe0c person析构函数的调用  vs结果为： person默认构造函数的调用 0045F7D4 person拷贝构造函数的调用 person析构函数的调用 0045F8CC person析构函数的调用
user-0 提问: C语言数组

回复:
user: user-1
content: 用结构体数组，先定义结构体。  struct stu { char no[16]; char name[32]; char gender[8]; int age; char tel[16]; }; struct stu student[40];    //定义一个40人的学生信息

user: user-2
content: 先建一个结构体，包含信息:学号，姓名，性别，年龄，班级，电话 然后建个结构体数组

user: user-3
content: 网上一搜一大片的，你照着修改一下就行了啊 https://blog.csdn.net/baidu_41922630/article/details/86715836 https://blog.csdn.net/weixin_44369212/article/details/89058548
user-0 提问: 各位大哥，关于C语言多次重新定义变量的问题？

回复:
user: user-0
content: C语言复合语句（语句块）  C语言中文网推出辅导班啦，包括「C语言辅导班、C++辅导班、算法/数据结构辅导班」，全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践 + 永久学习。QQ在线，随时响应！  复合语句（compound statement）简称为语句块，它使用大括号把许多语句和声明组合到一起，形成单条语句。 { [声明和语句的列表] }   语句块与简单的语句不同，语句块不用分号当作结尾。当出现语法上某处需要一条语句，但程序却需要执行多条语句时，就可以用到语句块。例如，可以在 if 语句中使用语句块，或者当循环体需要执行多条语句时，也可以使用语句块： { double result = 0.0, x = 0.0;         // 声明   static long status = 0;   extern int limit;   ++x;                                  // 语句   if ( status == 0 )   {                                     // 新语句块      int i = 0;      while ( status == 0 && i < limit )      { /* ... */ }                      // 另一个语句块   }   else   { /* ... */ }                         // 第三个语句块 }  如果语句块内需要有声明，通常会把声明放在语句块的头部，在其他语句之前。然而，C99 并不强制这么做，允许将声明放在语句块内的任何地方。  在语句块内声明的名称将具有语句块作用域。换句话说，这些名称只有自声明点开始，一直到语句块结尾之前有效。在这个作用域内，这种声明会把在语句块以外声明的同名称对象隐藏起来。  同样地，动态变量的存储周期也被限制在语句块中它们生成的地方。这意味着，如果一个变量没有被声明为 static 或 extern，那么该变量的存储空间会在语句块结束之后自动被释放。

user: user-1
content: 因为p是在代码块里，作用域是代码块内可见；而Q的作用域是main函数可见，所以是重定义。  p在for循环里，在循环里是可见和使用没问题，出了代码块（循环）就不认识了。

user: user-2
content: 复合语句包起来的范围是 块作用域 两个p定义在不同的块作用域 这是合法的

user: user-3
content: lz应该先找本入门级的书学习一下变量的作用域范围方面的知识

user: user-2
content: 这是一个作用域的问题 不同作用域相同符号表达不同实体 是允许的  把这句话套到你的代码里面  出现错误就是在一个作用域里面有定义了相同符号  没出现错误就是相同符号出现在不同作用域

user: user-4
content: 因为他在{} 里面，涉及到一个变量隐藏，局部变量重新定义会隐藏开头的那个变量。你两个变量同一个区域，没法隐藏，所以报错
user-0 提问: malloc_consolidate(): unaligned fastbin chunk detected

回复:
user: user-1
content: 解决了吗，我也遇到了类似的问题

user: user-2
content: 比如結構體中char數組可以定義為8的整數倍

user: user-2
content: 沒用過qt，根據unaligned猜測，可能是要求你做字節對齊。

user: user-0
content: 引用 1 楼 老马何以识途 的回复:沒用過qt，根據unaligned猜測，可能是要求你做字節對齊。  具体要怎么做呢？？？
user-0 提问: 求助 输出线性表的元素值

回复:
user: user-1
content: 建议楼主贴出代码吧，根据你的代码可以提出修改方法～

user: user-2
content: 线性表里应该有个size变量控制大小，还有个count变量控制现有元素的个数，如果 count > size 则输出错误
user-0 提问: C二级

回复:
user: user-1
content: b和a都是独立的结构体变量， b = a;这句已经将a的值都赋值给了b。包括name的内容（地址值），gender和score； 另外，b又对每个元素做了修改，除了gender和score是独立的值，name由于是和a一样指向了malloc的空间，因为上面提到了赋值是把a的name地址值赋值给了b的name，因此a和b的name指针都指向了相同的空间（堆上），因此对这部分空间的修改都会同步到a和b的name。

user: user-2
content: 因为a.name和b.name指向的地址相同 打个比方 char *p1=(char*)malloc(10); strcpy(p1, “zhao”); char *p2=p1; //p1,p2指向的地址相同 printf(“%s”, p2); //结果是什么？ strcpy(p2, “qian”); //修改p2指向的地址的信息 printf(“%s”, p1); //同理，这里结果是什么？
user-0 提问: 大佬救命！一个关于函数形参的基础问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:typedef struct Node//结构体 ,Node为结构名      {     } BiTNode,*BiTree;//一个是结构变量，一个是结构指针变量 //这里的理解是错的，不是变量，是类型，一个是结构体类型，一个是结构体指针类型   所以 BiTree *l 是二级指针，也就是指针的指针，因为BiTree本身就是指针类型，相当于 BiTNode** l，这是为了函数能返回初始化的指针，即 函数内改变 *l=XXX，函数外的 bt 的值也受影响 比如 int a=5 f(int *b) 要想在函数内改变*b，a也受影响，就要用一级指针（因为a本身是普通变量）  同样的 int *a = NULL; f(int **b) 要想在函数内改变*b，a也受影响，就需要用二级指针（因为a本身是指针）  BiTree bt; //bt是指针，相当于BiTNode* bt InitList(&bt); //所以这里要想在函数内改变*bt，外边的函数外的bt也受影响，就需要用二级指针，所以参数是BiTNode** 类型，即 BiTree* 类型  BiTree root 是一级指针，因为遍历函数里面不需要初始化指针，改变*root后往外传，所以用一级指针就可以了  所以，你的问题2，区别就是 用 BiTree *l,BiTree *bt，在函数内修改 *I 或 *bt，函数外的 bt 也受影响（一般这样的参数就是为了在函数内修改 *l 或 *bt） 用 BiTree root，再函数内修改 *root，函数外的 bt 不受影响 （一般这样的参数就是函数内不需要修改*root）大佬万岁，很高兴在早上就能看到你的完美解答，我都要笑抽了，心中的阴霾一扫而光这简直不要太爽，大佬祝你今天依旧元气满满啊

user: user-1
content: typedef struct Node//结构体 ,Node为结构名      {     } BiTNode,*BiTree;//一个是结构变量，一个是结构指针变量 //这里的理解是错的，不是变量，是类型，一个是结构体类型，一个是结构体指针类型   所以 BiTree *l 是二级指针，也就是指针的指针，因为BiTree本身就是指针类型，相当于 BiTNode** l，这是为了函数能返回初始化的指针，即 函数内改变 *l=XXX，函数外的 bt 的值也受影响 比如 int a=5 f(int *b) 要想在函数内改变*b，a也受影响，就要用一级指针（因为a本身是普通变量）  同样的 int *a = NULL; f(int **b) 要想在函数内改变*b，a也受影响，就需要用二级指针（因为a本身是指针）  BiTree bt; //bt是指针，相当于BiTNode* bt InitList(&bt); //所以这里要想在函数内改变*bt，外边的函数外的bt也受影响，就需要用二级指针，所以参数是BiTNode** 类型，即 BiTree* 类型  BiTree root 是一级指针，因为遍历函数里面不需要初始化指针，改变*root后往外传，所以用一级指针就可以了  所以，你的问题2，区别就是 用 BiTree *l,BiTree *bt，在函数内修改 *I 或 *bt，函数外的 bt 也受影响（一般这样的参数就是为了在函数内修改 *l 或 *bt） 用 BiTree root，再函数内修改 *root，函数外的 bt 不受影响 （一般这样的参数就是函数内不需要修改*root）
user-0 提问: 小白 这里看不太懂 求大神指点

回复:
user: user-1
content: char是有符号的，占1个字节（8位二进制）大小，所以只能表示-128到127范围。 258超出了char的范围，所以自动截取低8位，截取结果就是2（258%256=2）

user: user-2
content: 258==0X102; char 只有8位，所以只能存2了
user-0 提问: 请问谁能提供libui库for windows完整的下载地址？

回复:
user: user-0
content: 你这发跟没发，没什么区别，你发的这个链接我早就看过了，不知道下载哪个具体文件我才发的这个帖子。

user: user-1
content: https://github.com/andlabs/libui
user-0 提问: 明明定义了变量怎么老是说没有定义？[Error] 'scanf' was no declared in this scope

回复:
user: user-1
content: 引用 4 楼 weixin_44277207 的回复:申请空间的语句换成你那条就报错了 studnet1=(stu*)malloc(sizeof(stu)); //这样申请内存

user: user-0
content: 申请空间的语句换成你那条就报错了

user: user-0
content: 请问越界了要怎么解决呢？

user: user-2
content: #include <iostream> #include <stdlib.h>     /*使用malloc( ) 需要*/ #include <stdio.h>   //或<cstdio>   using namespace std; struct data /*定义结构体*/ {     int day,month,year; };  typedef struct  /*定义结构体*/ {   char name[20];     long num;     struct data birthday;  /*嵌套的结构体类型成员*/ }stu; int main(int argc, char** argv) {     stu *student1;     stu student2;     //student1=(stu *) malloc(10*sizeof(char));     student1=(stu *) malloc(10*sizeof(char));    //这里申请的空间不足，用下面这句比较合适     // studnet1=malloc(sizeof(struct stu));     // studnet2=malloc(sizeof(struct stu));     printf("Input name,num,year,month,day:/n");     scanf("%s",student1->name);    //这里已经越界了     scanf("%ld",&student1->num);     scanf("%d%d%d",&student1->birthday.year,&student1->birthday.month,&student1->birthday.day);     printf("/nOutputname,number,year,month,day/n");     printf("%20s%10ld%10d//%d//%d/n",             student2.name,             student2.num,             student2.birthday.year,             student2.birthday.month,             student2.birthday.day);     return 0; } 供参考～

user: user-1
content: 加上头文件 #inlcude <stdio.h>
user-0 提问: C语言头文件找不到变量类型

回复:
user: user-1
content: 引用 8 楼 肥牛肉^*^ 的回复:那我shishi头文件里如果要用printf就要引用stdio.h，但是我有的时候没有加stdio.h也可以用printf 你的贴图里没有print啊，如果用到stdio.h，include进来也没问题，stdio.h里有防止重复include的宏定义，所以多次include也没问题 你不加stdio.h也能用printf，可能是因为其它头文件里inlcude了它，你inlcude其它的头文件，就会把它也一起include了

user: user-0
content: 引用 1 楼 qybao的回复:把typedef int PON; 放到 shishi.h文件里去 typedef int PON;放在main.c里，shishi.h是看不到PON的，所以不知道PON是什么类型。 放到 shishi.h 文件的话shishi.h就知道PON是什么了，而main.c里 #include "shishi.h"后main也会知道这一切信息的 写typedef int PON然后引用头文件shishi.h这样shishi.h里面为什么检测不到

user: user-1
content: 把typedef int PON; 放到 shishi.h文件里去 typedef int PON;放在main.c里，shishi.h是看不到PON的，所以不知道PON是什么类型。 放到 shishi.h 文件的话shishi.h就知道PON是什么了，而main.c里 #include "shishi.h"后main也会知道这一切信息的

user: user-0
content: 引用 7 楼 qybao的回复:[quote=引用 5 楼 肥牛肉^*^ 的回复:]就是把typedef int PON放到头文件里，还要把include《stdio.h》也放到shishi.h头文件里面吗 1L回答不是说了吗，把typedef int PON放到shishi.h头文件里面就可以了。 include《stdio.h》不用放到shishi.h头文件里，因为你的f函数没用到stdio.h的东西，所以不需要它。[/quote] 那我shishi头文件里如果要用printf就要引用stdio.h，但是我有的时候没有加stdio.h也可以用printf

user: user-1
content: 引用 5 楼 肥牛肉^*^ 的回复:就是把typedef int PON放到头文件里，还要把include《stdio.h》也放到shishi.h头文件里面吗 1L回答不是说了吗，把typedef int PON放到shishi.h头文件里面就可以了。 include《stdio.h》不用放到shishi.h头文件里，因为你的f函数没用到stdio.h的东西，所以不需要它。

user: user-2
content: typedef int PON 和 include《stdio.h》放到shishi.h头文件里面

user: user-0
content: 就是把typedef int PON放到头文件里，还要把include《stdio.h》也放到shishi.h头文件里面吗

user: user-3
content: 引用 2 楼 肥牛肉^*^ 的回复:[quote=引用 1 楼 qybao的回复:]把typedef int PON; 放到 shishi.h文件里去 typedef int PON;放在main.c里，shishi.h是看不到PON的，所以不知道PON是什么类型。 放到 shishi.h 文件的话shishi.h就知道PON是什么了，而main.c里 #include "shishi.h"后main也会知道这一切信息的 写typedef int PON然后引用头文件shishi.h这样shishi.h里面为什么检测不到[/quote] 你放到头文件里之后还要把所在的头文件include到shishi.h文件里。这是头文件里引入头文件。即在shishi.h里还要加一个#include ""这个双引号是定义PON的。

user: user-1
content: 因为你的shishi.h不会去#include “main.c”（一般没有这种做法）。哪个文件有什么信息，别的文件不include它就不会知道该文件的信息。就好像你的朋友有10块钱，你include你的朋友，你才可以看到他的10块钱，否则，他有多少钱你不可能知道。文件也一样，include就相当于把别的文件信息加到当前文件。
user-0 提问: 函数参数的理解

回复:
user: user-1
content: 形参是指针了，写的是数组的样子，但是编译器已经将其作为指针操作了。 也可以从另外一个角度去分析，如果形参是数组，那么数组名能作为左值吗？答案是否定的，那么是不是也验证了形参不是数组呢？  函数调用是实参赋值给形参。

user: user-2
content: 数组名作为函数参数会退化为指针，你计算的是一个指针的大小，4没问题啊

user: user-3
content: 1、C语言中当函数参数声明为数组时，实际上参数传递的是指针，原因是节省空间和时间。C语言中的数组实际是一段连续的内存空间，如果要把一个数组从A内存复制到B内存将会是一个极其消耗空间和时间的操作，既然连续，只需要把首地址传递即可 2、C语言中如果你真想把一个数组整个进行函数参数传递，可以封装为结构体，函数参数声明类型为此结构体

user: user-4
content: 运行结果没问题，数组作为参数没法传长度，就是一个指针，所以长度都是另加一个参数定义的

user: user-5
content: 月经问题了sizeof( 数组） =数组所占用的字节数  sizeof（指针）=指针的长度  把数组传入函数，则参数变为指针

user: user-1
content: 形参是指针不是数组，虽然定义的是数组形式，但是编译器将其作为指针。因为传参是实参把arr传给test_arr，其实是把arr的地址传给test_arr，所以test_arr是指针，也可以从这方面考虑认为其是指针。

user: user-6
content: 这段代码在哪里抄的? 从抄代码的地方开始继续往下读 读10行 你看书都不看字的吗?
user-0 提问: 字符串排序

回复:
user: user-1
content: 引用 4 楼 不好意思的平头哥 的回复:[quote=引用 1 楼 真相重于对错的回复:]因为a是一个 char*[],qsort原型   void qsort (void* base, size_t num, size_t size,             int (*compar)(const void*,const void*));  第二个参数是共多少项，第三参数是 每项长度多少   qsort按照数量和每项的长度 依次取出每一项 char** ,所以要转换为(char**)，然后对char** 解引用才会得到正确字符串_ 再问一下，就是把每一项的char **作为参数是吗？但是compare的形参是void * i，实参char**怎么传给compare的，可以再详细说一下吗？[/quote] 传的都是地址，就是char *的地址值和char **类型都是指针，都是地址值。这是对象的类型不一样而已，类型不一样标识其内存里访问的偏移量不一致。

user: user-0
content: 引用 1 楼 真相重于对错的回复:因为a是一个 char*[],qsort原型   void qsort (void* base, size_t num, size_t size,             int (*compar)(const void*,const void*));  第二个参数是共多少项，第三参数是 每项长度多少   qsort按照数量和每项的长度 依次取出每一项 char** ,所以要转换为(char**)，然后对char** 解引用才会得到正确字符串_ 再问一下，就是把每一项的char **作为参数是吗？但是compare的形参是void * i，实参char**怎么传给compare的，可以再详细说一下吗？

user: user-1
content: int compare(const void *i, const void *j) compare函数定义成这样吧，加上const，否则有些编译器会报错

user: user-1
content: 要看传到compare函数里的实参是什么类型。快排传到compare里的类型是a的类型，即char **类型。比较的是char *类型的数据。用strcmp就是对字符串比较大小。

user: user-2
content: 因为a是一个 char*[],qsort原型   void qsort (void* base, size_t num, size_t size,             int (*compar)(const void*,const void*));  第二个参数是共多少项，第三参数是 每项长度多少   qsort按照数量和每项的长度 依次取出每一项 char** ,所以要转换为(char**)，然后对char** 解引用才会得到正确字符串_
user-0 提问: C语言条件编译出错

回复:
user: user-0
content: 引用 1 楼 自信男孩 的回复:全局变量不初始化，默认会被初始化为0。因为定义Nil的头文件被多个源文件引入，所以会被认为多次定义建议改成： extern TElemType Ni1; 一语中的，非常感谢

user: user-0
content: http://c.biancheng.net/view/404.html 如果整个工程由多个源文件组成，在一个源文件中想引用另外一个源文件中已经定义的外部变量，同样只需在引用变量的文件中用 extern 关键字加以声明即可。下面就来看一个多文件的示例: /****max.c****/ #include <stdio.h> /*外部变量声明*/ extern int g_X ; extern int g_Y ; int max() {     return (g_X > g_Y ? g_X : g_Y); }  /***main.c****/ #include <stdio.h> /*定义两个全局变量*/ int g_X=10; int g_Y=20; int max(); int main(void) {     int result;     result = max();     printf("the max value is %d\n",result);     return 0; }  对于多个文件的工程，都可以采用上面这种方法来操作。对于模块化的程序文件，可在其文件中预先留好外部变量的接口，也就是只采用 extern 声明变量，而不定义变量，max.c 文件中的 g_X 与 g_Y 就是如此操作的。

user: user-1
content: 要不然，可以在一个源文件里（.c）中用TElemType Ni1；其他.c文件都用extern TElemType Ni1;

user: user-1
content: 全局变量不初始化，默认会被初始化为0。因为定义Nil的头文件被多个源文件引入，所以会被认为多次定义建议改成： extern TElemType Ni1;