| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5750 人关注过本帖
标题:求助,如何用malloc为字符串数组分配空间
只看楼主 加入收藏
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
结帖率:83.33%
收藏
已结贴  问题点数:20 回复次数:8 
求助,如何用malloc为字符串数组分配空间
如题,我想读取一个文件中的所有字符串,然后存入字符串数组中。
我是这样声明字符串数组的: char tempstring[900][256]
但是事先并不知道文件里有多少个字符串,所以如果文件的字符串大于900,程序就会无法运行下去
但是如果我把字符串个数改为50000(也就是 char tempstring[50000][256]),程序还没运行就崩溃了,返回一个很大的数值
因此我想试试用malloc为字符串数组分配空间,但是有个问题是如果字符串真的达到50000个,那么申请50000*256的空间,系统会崩溃吗。
搜索更多相关主题的帖子: malloc 字符串 数组 分配 空间 
2018-09-26 18:28
no1xijin
Rank: 9Rank: 9Rank: 9
来 自:江西
等 级:贵宾
威 望:20
帖 子:211
专家分:1207
注 册:2015-7-8
收藏
得分:0 
数组下标过大是会导致程序崩溃的,这个涉及的原理比较底层,建议你在开始读的时候控制字符串长度。若长度太大,输出提示信息,退出程序。
我的https://bbs.bccn.net/thread-488504-1-1.html这个程序在标题中提示位数了,未在程序中处理,这个位数的限制就是由于数组下标的限制。

126邮箱联系方式:no1xijin@126. com
2018-09-26 19:17
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
用一个动态指针数组存放每个动态分配的字符串空间的地址。
2018-09-26 19:34
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
收藏
得分:0 
回复 2楼 no1xijin
刚刚试了一下声明一个50000的指向char的指针数组(char * tempstring[50000]),程序倒是可以运行,不明白什么原理。。
2018-09-26 20:14
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
收藏
得分:0 
回复 3楼 吹水佬
是这样声明吗?
char * tempstring[50000];
int i;
for(i = 0; i< 50000;i++)
{
      tempstring[i] = (char*)malloc(256);
}
2018-09-26 20:26
no1xijin
Rank: 9Rank: 9Rank: 9
来 自:江西
等 级:贵宾
威 望:20
帖 子:211
专家分:1207
注 册:2015-7-8
收藏
得分:0 
回复 4楼 心空之上
50000只是一个大致范围,仅作为一个参考值,不是固定的一个值,这个值及以下值程序可以正常运行,略微超过也可以正常运行,超过太多将导致程序崩溃。

126邮箱联系方式:no1xijin@126. com
2018-09-26 20:39
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
收藏
得分:0 
回复 6楼 no1xijin
但是我声明50000的字符串数组的话就不能够运行,声明50000的指向char的指针就能运行,下标都是50000
2018-09-26 21:08
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:10 
65535可能是你的上限。c语言也是用汇编搞的。跟系统和编译环境有很大关系。换个c#编译环境试试。

[此贴子已经被作者于2018-9-26 21:40编辑过]


我是硬件工程师
2018-09-26 21:28
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:10 
以下是引用心空之上在2018-9-26 20:26:46的发言:

是这样声明吗?
char * tempstring[50000];
int i;
for(i = 0; i< 50000;i++)
{
      tempstring = (char*)malloc(256);
}

这是静态分配空间,在栈区的话很有限
可以试试放在堆区
或动态分配,例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 256
main()
{
    //测试文件数据
    FILE *fp = fopen("test.txt","w+");
    fprintf(fp, "%s\n", "abcd");
    fprintf(fp, "%s\n", "12345");
    fprintf(fp, "%s\n", "");
    fprintf(fp, "%s\n", "ABCDEF");
    fseek(fp, 0, SEEK_SET);
    //从文件读入内存
    char buf[BUFFER_SIZE];
    char *p=buf;
    char **pp=NULL;
    int i, len, n=0;
    while((fgets(buf,BUFFER_SIZE,fp)) != NULL)
    {
        if ((p=strchr(buf,'\n')) != NULL)
            *p = '\0';
        len = strlen(buf)+1;
        if (len > 1)
        {
            pp = (char**)realloc(pp, (n+1)*sizeof(char*));
            pp[n] = (char*)malloc(len);
            strcpy(pp[n], buf);
            ++n;
        }
    }
    fclose(fp);
    for (i=0; i<n; ++i)
        printf("%s\n", pp[i]);
    for (i=0; i<n; ++i)
        free(pp[i]);
    free(pp);
}




[此贴子已经被作者于2018-9-27 09:29编辑过]

2018-09-27 09:10
快速回复:求助,如何用malloc为字符串数组分配空间
数据加载中...
 
   



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

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