| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1617 人关注过本帖
标题:关于为指针分配内存的问题
只看楼主 加入收藏
EdmundDantes
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:62
专家分:173
注 册:2016-11-9
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:9 
关于为指针分配内存的问题
各位前辈好,我是一个新手,这是一个获取字符串然后排序的小程序,代码如下
#define _STDC_WANT_LIB_EXT1_ 1
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
     int capacity = 5;
     char** pString = calloc(capacity,sizeof(char*));
     char** pTemp = NULL;
     size_t maxlen = 50;
     char buf[maxlen];
     int count = 0;
     printf("Enter a string,enter empty line to end and print result.\n"); //提示信息
     while(true)
     {
         fgets(buf,maxlen - 1,stdin);
         if(strnlen(buf,maxlen) - 1 == 0)    //空行跳出循环
           break;
         if(buf[strnlen(buf,maxlen) - 1] == '\n') //解决末位的换行符
            buf[strnlen(buf,maxlen) - 1] = '\0';
         *(pString + count) = calloc(strnlen(buf,maxlen),sizeof(char));  //为字符串指针分配内存
         if(!(strcat(*(pString + count++),buf)))   //将buf链接到分配好的字符串指针
           return 1;
         if(count == capacity)  //给char**增加容量
         {   
            capacity += 5;
            pTemp = pString;
            pString = calloc(capacity,sizeof(char*));
            pString = pTemp;
            pTemp = NULL;
         }
     }
     
     int i = 0;     //冒泡排序
     int j = 0;
     for(i = 1;i < count;++i)
     {
        for(j = 0;j < count - i;++j)
        {
            if(strnlen(*(pString + j),maxlen) >  strnlen(*(pString + j + 1),maxlen))
            {
               strcpy(buf,*(pString + j));
               strcpy(*(pString + j),*(pString + j + 1));
               strcpy(*(pString + j + 1),buf);
            }
        }   
     }
     
     printf("This is you just enter Strings:\n");  //显示结果
     for(i = 0;i < count;++i)
      printf("%s\n",*(pString + i));
     printf("show is end\n");
     
     for(i = 0;i < count - 1;++i)  //释放内存
        free(*(pString + i));
     free(pString);
     return 0;
}
这个程序测试了一下,有几个问题:
1程序对次数7似乎很敏感,比如输入8个“11111111”,再输入7个“1111111”,*(pString + count) = calloc(strnlen(buf,maxlen),sizeof(char));这条语句就会出问题,程序崩溃。
输入超过8个字符串也回出现崩溃。输入7个字符串在释放内存的时候也会崩溃,看了几遍,仍然没有找到问题所在。如果哪位前辈有空,帮我看下,指教一下问题所在。真心感谢!

搜索更多相关主题的帖子: capacity include 提示信息 result 字符串 
2016-11-09 15:48
EdmundDantes
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:62
专家分:173
注 册:2016-11-9
收藏
得分:0 
学艺不精,实在惭愧,有空帮看下,好苦恼啊
2016-11-09 15:51
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
写的挺长的。

8个1的时候 申请8个空间
7个1的时候 申请7个空间

前面没啥问题

后面用了排序,排序交换

于是出现了把 8个 1 写入 7个空间的情况


[fly]存在即是合理[/fly]
2016-11-09 16:15
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
说错了一点,前面也有问题

应该多申请一个空间存储末尾的 0

strcat 时给最后的0 写数据没有空间可放了,谁知道会写到哪个莫名其妙的地方呢


[fly]存在即是合理[/fly]
2016-11-09 16:22
EdmundDantes
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:62
专家分:173
注 册:2016-11-9
收藏
得分:0 
回复 3楼 azzbcc
恩,后面排序确实有明显问题,多谢多谢。可是while循环没有跳出的时候,我先输入8个1,再输入7个1,程序就会崩溃,这个是什么原因呢?
2016-11-09 16:22
EdmundDantes
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:62
专家分:173
注 册:2016-11-9
收藏
得分:0 
回复 4楼 azzbcc
恩是,果然是因为'\0'没地方放了才出现的问题,多谢,老司机啊。那我后面释放资源的循环有问题吗?前辈
2016-11-09 16:27
EdmundDantes
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:62
专家分:173
注 册:2016-11-9
收藏
得分:0 
回复 4楼 azzbcc
超过6个字符串,释放资源也会崩溃,我真的好笨。。。
2016-11-09 16:29
EdmundDantes
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:62
专家分:173
注 册:2016-11-9
收藏
得分:0 
感觉光是指针就会让我白了头~~~
2016-11-09 16:32
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:20 


增加容量的地方有问题

释放没问题


[fly]存在即是合理[/fly]
2016-11-09 16:33
EdmundDantes
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:62
专家分:173
注 册:2016-11-9
收藏
得分:0 
回复 9楼 azzbcc
多谢指教,我再翻阅一下书,自学,见笑了
2016-11-09 16:34
快速回复:关于为指针分配内存的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027835 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved