免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5269 | 回复: 4

[C] 诡异问题求助,调用malloc函数之后,一个无关的字符数组的内容被覆盖掉了 [复制链接]

论坛徽章:
0
发表于 2017-09-30 16:57 |显示全部楼层
本帖最后由 Yamatehhhhhh 于 2017-09-30 17:04 编辑

程序代码如下,在外层while循环到第三次时,调用完malloc函数(第16行),发现字符数组buffer的值被修改了,看上去像是被覆盖了。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define NUMERIC 0
  4. #define OPERATOR 1

  5. int main() {
  6.     char buffer[] = "1.5+2*3^4/-5";             // The expression buffer
  7.     char *pbuffer = buffer;                            // The pointer to expression buffer
  8.     char *pelements[] = {NULL};             // Restore the elements have been parsed
  9.     size_t index = 0;                       // The index of element is being parse
  10.     int type = NUMERIC;                     // The type of current index, NUMERIC or OPERATOR

  11.     while(*pbuffer != '\0') {
  12.         int i = 0;
  13.         printf("Line %d: %s\n", __LINE__, buffer);                // The index for pelements[index]
  14.         pelements[index] = (char *)malloc(320);         // Alloc memory for pointer
  15.         printf("Line %d: %s\n", __LINE__, buffer);

  16.         if(type == NUMERIC) {
  17.             printf("Line %d: %s\n", __LINE__, buffer);
  18.             *(pelements[index]+i++) = *pbuffer++;       // Read one char firstly
  19.             while(*pbuffer!='-' && *pbuffer!='+' && *pbuffer!='/' && *pbuffer!='*' && *pbuffer!='^' && *pbuffer!='\0') {
  20.                 *(pelements[index]+i++) = *pbuffer++;
  21.             }

  22.             *(pelements[index]+i) = '\0';               // Add '\0'
  23.             index++;
  24.             type = OPERATOR;
  25.         } else {
  26.             if(*pbuffer=='\0') break;
  27.             *(pelements[index]+i++) = *pbuffer++;
  28.             *(pelements[index]+i) = '\0';
  29.             index++;
  30.             type = NUMERIC;
  31.             printf("Line %d: %s\n", __LINE__, buffer);
  32.         }
  33.     }
  34. }
复制代码


论坛徽章:
0
发表于 2017-09-30 16:59 |显示全部楼层
本帖最后由 Yamatehhhhhh 于 2017-09-30 17:05 编辑

程序的执行结果是这样的:

  1. Line 15: 1.5+2*3^4/-5
  2. Line 17: 1.5+2*3^4/-5
  3. Line 20: 1.5+2*3^4/-5
  4. Line 15: 1.5+2*3^4/-5
  5. Line 17: 1.5+2*3^4/-5
  6. Line 35: 1.5+2*3^4/-5
  7. Line 15: 1.5+2*3^4/-5
  8. Line 17:
复制代码


论坛徽章:
0
发表于 2017-09-30 17:02 |显示全部楼层
程序里几行print语句都是一样的,就是打印buffer这个字符数组的值,让人百思不得解的是为什么调用malloc给另一个指针分配内存之后,buffer的值就像被覆盖了一样。

论坛徽章:
268
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2017-09-30 17:27 |显示全部楼层
char *pelements[?]

论坛徽章:
0
发表于 2017-09-30 17:54 |显示全部楼层
回复 4# hellioncu

一语道破天机,因为不确定数组元素个数,就没有指定数组的大小,指定数组大小后这个问题就解决了,谢谢! 还是自己太随意了啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

基于案例的 SQL 优化实战训练营

讲师:中电福富特级专家梁敬彬,参与本次课程培训,你将收获:
1. 能编写出较为高效的 SQL;
2. 能解决70%以上的数据库常见优化问题;
3. 能得到老师提供的高效的相关工具和解决方案;
4. 能举一反三,收获不仅仅是 SQL 优化。
现在购票享受8.8折优惠!
----------------------------------------
优惠时间:2019年3月20日前

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP