请教大神,字符串长度有限制吗,最长多少。

ttkl1108 2018-01-26 11:09:08
题目 :
求一个母字符串中子串出现的次数,母字符串长度至少为10的7次方。 比如,这样定义char a[10000000];
char b[10000000];编译通过,但无法运行。求教大神,怎么办。
...全文
2705 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
BAO BAO 2018-02-08
  • 打赏
  • 举报
回复
c标准里是没有限制的,具体看你怎么定义的字符串,以及存放在什么地方了 像你这么定义的 char a[]的局部变量 一般都是在栈内存中存放 栈内存使用大小系统是有限制的, 建议使用malloc来申请内存空间存放 这样存放的地方是堆内存里 想存多少存多少 记得free
zhagoodwell 2018-02-05
  • 打赏
  • 举报
回复
# include <stdio.h>
# define N 100000000
char A[N],B[N];
//返回b在a中的个数
int BF(char a[],char b[]){
    int i=0,j=0,k=0;
    do{
        if (b[j]&&a[i++]==b[j])
            ++j;
        else
        {
            b[j]?(i-=j):k++;
            j=0;
        }
    }while(a[i-1]);
        return k;
}
int main(){
   gets(A);
   gets(B);
   printf("B在A中出现的次数:%d\n",BF(A,B));
}
能运行 你试试
zhagoodwell 2018-02-05
  • 打赏
  • 举报
回复
用全局变量:
# include<stdio.h>
# define N 100000000
char A[N],B[N];
int main(){
    return 0;
}
赵4老师 2018-02-05
  • 打赏
  • 举报
回复
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
xiaohuh421 2018-02-01
  • 打赏
  • 举报
回复
从语法上来说, 字符串长度是可以无限长的. 但实际应用中, 会受到内存大小限制字符串长度. 如果是栈中分配字符串空间, 默认口有1M大小, 可以通过编译选项修改这个值 . 在堆中申请的话, 理论上来说内存条的内存还剩多大, 就是分配多大. 但实际情况需要考虑有没有这么大的连续内存. 其它静态区, 常量区也类似.
kongrenxin 2018-01-31
  • 打赏
  • 举报
回复
引用 6 楼 ttkl1108 的回复:
mallo动态申请空间不行呀,总是失败。
说明你系统里的可用内存不够,才会失败。 但是你说母字符串长度至少为10的7次方, 10M都不到,现在的系统不应该分配不出来, 除非是嵌入式小系统,内存不够。 你看看你自己到执行分配多少了?
faihung 2018-01-30
  • 打赏
  • 举报
回复
你确定栈的空间够大?
热血打工人 2018-01-30
  • 打赏
  • 举报
回复
编译器设定里面把栈定义加大,默认是1M。 VC++堆栈默认大小是1M,如果你分配大于1M的堆,一般会出异常,这里你要把堆调大些,下面是VC++6.0与VC++2010的设置方法http://blog.csdn.net/mingojiang/article/details/17580021
啊哈moment 2018-01-30
  • 打赏
  • 举报
回复
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 字符串这么长可以放在文件里进行读取固定长度数据到缓冲区
晨星 2018-01-30
  • 打赏
  • 举报
回复
既然长度“至少”10的7次方,就算申请成功了恐怕也不行的,还是仔细想想别的办法吧。
AlbertS 2018-01-30
  • 打赏
  • 举报
回复
字符串的长度没有限制,但是存储字符串的内存是有限制的,具体要看你的编译环境和程序位数,在不超过机器内存和限制的情况下,局部变量的限制最大,一般只有1M左右,超过这个限制,程序无法运行,你可以使用new或者malloc来动态的申请空间,如果只是简单的小程序,可以把变量申请放在全局区域,这样内存可以申请的大一些
自信男孩 2018-01-27
  • 打赏
  • 举报
回复
引用 6 楼 ttkl1108 的回复:
mallo动态申请空间不行呀,总是失败。
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。 建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。
ttkl1108 2018-01-27
  • 打赏
  • 举报
回复
mallo动态申请空间不行呀,总是失败。
自信男孩 2018-01-27
  • 打赏
  • 举报
回复
引用 10 楼 antuicang9886 的回复:
[quote=引用 9 楼 cfjtaishan 的回复:] [quote=引用 8 楼 antuicang9886 的回复:] 局部变量使用的占内存空间,尽量别占用太多 [quote=引用 7 楼 cfjtaishan 的回复:] [quote=引用 6 楼 ttkl1108 的回复:] mallo动态申请空间不行呀,总是失败。
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。 建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。[/quote] 我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的: #include<stdio.h> void test() { char *a; a = malloc(10000000*sizeof(char)); printf("done!\n"); } main() { test(); } 楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。 [/quote] 我没说malloc申请的是栈上空间,malloc申请的是堆上空间。 空间申请要根据实际需要来定,不能一下子申请太多的空间,不然会导致系统的其他功能模块运行不稳定或流畅。也会导致系统运行迟缓[/quote] 不好意思,看错了。建议与上述几位相同,局部变量不易过大,可改为static或者全局变量,在函数调用时,可再用指针访问。局部变量过大容易引起栈内存空间耗尽,尤其是在运用递归的时候。[/quote] static定义的也是全局的,叫做静态全局变量,不过static限制了其作用域,static定义的变量的生命周期和全局变量的生命周期是一样的
antuicang9886 2018-01-27
  • 打赏
  • 举报
回复
引用 9 楼 cfjtaishan 的回复:
[quote=引用 8 楼 antuicang9886 的回复:] 局部变量使用的占内存空间,尽量别占用太多 [quote=引用 7 楼 cfjtaishan 的回复:] [quote=引用 6 楼 ttkl1108 的回复:] mallo动态申请空间不行呀,总是失败。
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。 建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。[/quote] 我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的: #include<stdio.h> void test() { char *a; a = malloc(10000000*sizeof(char)); printf("done!\n"); } main() { test(); } 楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。 [/quote] 我没说malloc申请的是栈上空间,malloc申请的是堆上空间。 空间申请要根据实际需要来定,不能一下子申请太多的空间,不然会导致系统的其他功能模块运行不稳定或流畅。也会导致系统运行迟缓[/quote] 不好意思,看错了。建议与上述几位相同,局部变量不易过大,可改为static或者全局变量,在函数调用时,可再用指针访问。局部变量过大容易引起栈内存空间耗尽,尤其是在运用递归的时候。
自信男孩 2018-01-27
  • 打赏
  • 举报
回复
引用 8 楼 antuicang9886 的回复:
局部变量使用的占内存空间,尽量别占用太多 [quote=引用 7 楼 cfjtaishan 的回复:] [quote=引用 6 楼 ttkl1108 的回复:] mallo动态申请空间不行呀,总是失败。
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。 建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。[/quote] 我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的: #include<stdio.h> void test() { char *a; a = malloc(10000000*sizeof(char)); printf("done!\n"); } main() { test(); } 楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。 [/quote] 我没说malloc申请的是栈上空间,malloc申请的是堆上空间。 空间申请要根据实际需要来定,不能一下子申请太多的空间,不然会导致系统的其他功能模块运行不稳定或流畅。也会导致系统运行迟缓
antuicang9886 2018-01-27
  • 打赏
  • 举报
回复
局部变量使用的占内存空间,尽量别占用太多
引用 7 楼 cfjtaishan 的回复:
[quote=引用 6 楼 ttkl1108 的回复:] mallo动态申请空间不行呀,总是失败。
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。 建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。[/quote] 我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的: #include<stdio.h> void test() { char *a; a = malloc(10000000*sizeof(char)); printf("done!\n"); } main() { test(); } 楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。
赵4老师 2018-01-26
  • 打赏
  • 举报
回复
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
自信男孩 2018-01-26
  • 打赏
  • 举报
回复
不能运行的原因是你定义的该变量是局部变量吧,建议定义成全局或通过malloc/free,new/delete申请堆上的空间。 什么字符串要这么多大,不能一段一段的遍历和比较吗?这么大的空间,若用一段一段的处理会更好吧
真相重于对错 2018-01-26
  • 打赏
  • 举报
回复
1、编译器设定里面把栈定义加大 2、改成 char* p = new char[10000];
加载更多回复(2)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧