求一个母字符串中子串出现的次数,母字符串长度至少为10的7次方。 比如,这样定义char a[10000000];
char b[10000000];编译通过,但无法运行。求教大神,怎么办。
21 个解决方案
#1
[1、编译器设定里面把栈定义加大
2、改成 char* p = new char[10000];, 不能运行的原因是你定义的该变量是局部变量吧,建议定义成全局或通过malloc/free,new/delete申请堆上的空间。
什么字符串要这么多大,不能一段一段的遍历和比较吗?这么大的空间,若用一段一段的处理会更好吧, 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
, 定义大于等于1000的数组要用new或者malloc动态申请空间, 第一点:大数组最好是动态分配;
第二点:也是一个没有分配过大数组人容易遇到的盲区,那就是字符类型的限制;举个例 char tr[n],这里的n默认是int型,那么问题就来来,int型的范围是有限制的,虽然编译不会出错,但是用的时候就会出错;所以大数组,最好先定义一个size_t 类型的数,然后再分配;例如:size_t n=1000;char tr[n*10000];
不知道我说的是不是你问的!, mallo动态申请空间不行呀,总是失败。,
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。
建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。, 局部变量使用的占内存空间,尽量别占用太多
我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的:
#include<stdio.h>
void test()
{
char *a;
a = malloc(10000000*sizeof(char));
printf("done!\n");
}
main()
{
test();
}
楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。
,
我没说malloc申请的是栈上空间,malloc申请的是堆上空间。
空间申请要根据实际需要来定,不能一下子申请太多的空间,不然会导致系统的其他功能模块运行不稳定或流畅。也会导致系统运行迟缓,
不好意思,看错了。建议与上述几位相同,局部变量不易过大,可改为static或者全局变量,在函数调用时,可再用指针访问。局部变量过大容易引起栈内存空间耗尽,尤其是在运用递归的时候。,
static定义的也是全局的,叫做静态全局变量,不过static限制了其作用域,static定义的变量的生命周期和全局变量的生命周期是一样的, 字符串的长度没有限制,但是存储字符串的内存是有限制的,具体要看你的编译环境和程序位数,在不超过机器内存和限制的情况下,局部变量的限制最大,一般只有1M左右,超过这个限制,程序无法运行,你可以使用new或者malloc来动态的申请空间,如果只是简单的小程序,可以把变量申请放在全局区域,这样内存可以申请的大一些, 既然长度“至少”10的7次方,就算申请成功了恐怕也不行的,还是仔细想想别的办法吧。, 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
字符串这么长可以放在文件里进行读取固定长度数据到缓冲区, 编译器设定里面把栈定义加大,默认是1M。
VC++堆栈默认大小是1M,如果你分配大于1M的堆,一般会出异常,这里你要把堆调大些,下面是VC++6.0与VC++2010的设置方法 http://blog.csdn.net/mingojiang/article/details/17580021, 你确定栈的空间够大?,
说明你系统里的可用内存不够,才会失败。 但是你说母字符串长度至少为10的7次方, 10M都不到,现在的系统不应该分配不出来, 除非是嵌入式小系统,内存不够。
你看看你自己到执行分配多少了?
, 从语法上来说, 字符串长度是可以无限长的.
但实际应用中, 会受到内存大小限制字符串长度.
如果是栈中分配字符串空间, 默认口有1M大小, 可以通过编译选项修改这个值 .
在堆中申请的话, 理论上来说内存条的内存还剩多大, 就是分配多大. 但实际情况需要考虑有没有这么大的连续内存.
其它静态区, 常量区也类似., 在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
, 用全局变量:
能运行 你试试]
2、改成 char* p = new char[10000];, 不能运行的原因是你定义的该变量是局部变量吧,建议定义成全局或通过malloc/free,new/delete申请堆上的空间。
什么字符串要这么多大,不能一段一段的遍历和比较吗?这么大的空间,若用一段一段的处理会更好吧, 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
, 定义大于等于1000的数组要用new或者malloc动态申请空间, 第一点:大数组最好是动态分配;
第二点:也是一个没有分配过大数组人容易遇到的盲区,那就是字符类型的限制;举个例 char tr[n],这里的n默认是int型,那么问题就来来,int型的范围是有限制的,虽然编译不会出错,但是用的时候就会出错;所以大数组,最好先定义一个size_t 类型的数,然后再分配;例如:size_t n=1000;char tr[n*10000];
不知道我说的是不是你问的!, mallo动态申请空间不行呀,总是失败。,
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。
建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。, 局部变量使用的占内存空间,尽量别占用太多
我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的:
#include<stdio.h>
void test()
{
char *a;
a = malloc(10000000*sizeof(char));
printf("done!\n");
}
main()
{
test();
}
楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。
,
局部变量使用的占内存空间,尽量别占用太多
mallo动态申请空间不行呀,总是失败。
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。
建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。
我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的:
#include<stdio.h>
void test()
{
char *a;
a = malloc(10000000*sizeof(char));
printf("done!\n");
}
main()
{
test();
}
楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。
我没说malloc申请的是栈上空间,malloc申请的是堆上空间。
空间申请要根据实际需要来定,不能一下子申请太多的空间,不然会导致系统的其他功能模块运行不稳定或流畅。也会导致系统运行迟缓,
局部变量使用的占内存空间,尽量别占用太多
mallo动态申请空间不行呀,总是失败。
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。
建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。
我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的:
#include<stdio.h>
void test()
{
char *a;
a = malloc(10000000*sizeof(char));
printf("done!\n");
}
main()
{
test();
}
楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。
我没说malloc申请的是栈上空间,malloc申请的是堆上空间。
空间申请要根据实际需要来定,不能一下子申请太多的空间,不然会导致系统的其他功能模块运行不稳定或流畅。也会导致系统运行迟缓
不好意思,看错了。建议与上述几位相同,局部变量不易过大,可改为static或者全局变量,在函数调用时,可再用指针访问。局部变量过大容易引起栈内存空间耗尽,尤其是在运用递归的时候。,
局部变量使用的占内存空间,尽量别占用太多
mallo动态申请空间不行呀,总是失败。
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。
建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。
我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的:
#include<stdio.h>
void test()
{
char *a;
a = malloc(10000000*sizeof(char));
printf("done!\n");
}
main()
{
test();
}
楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。
我没说malloc申请的是栈上空间,malloc申请的是堆上空间。
空间申请要根据实际需要来定,不能一下子申请太多的空间,不然会导致系统的其他功能模块运行不稳定或流畅。也会导致系统运行迟缓
不好意思,看错了。建议与上述几位相同,局部变量不易过大,可改为static或者全局变量,在函数调用时,可再用指针访问。局部变量过大容易引起栈内存空间耗尽,尤其是在运用递归的时候。
static定义的也是全局的,叫做静态全局变量,不过static限制了其作用域,static定义的变量的生命周期和全局变量的生命周期是一样的, 字符串的长度没有限制,但是存储字符串的内存是有限制的,具体要看你的编译环境和程序位数,在不超过机器内存和限制的情况下,局部变量的限制最大,一般只有1M左右,超过这个限制,程序无法运行,你可以使用new或者malloc来动态的申请空间,如果只是简单的小程序,可以把变量申请放在全局区域,这样内存可以申请的大一些, 既然长度“至少”10的7次方,就算申请成功了恐怕也不行的,还是仔细想想别的办法吧。, 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
字符串这么长可以放在文件里进行读取固定长度数据到缓冲区, 编译器设定里面把栈定义加大,默认是1M。
VC++堆栈默认大小是1M,如果你分配大于1M的堆,一般会出异常,这里你要把堆调大些,下面是VC++6.0与VC++2010的设置方法 http://blog.csdn.net/mingojiang/article/details/17580021, 你确定栈的空间够大?,
mallo动态申请空间不行呀,总是失败。
说明你系统里的可用内存不够,才会失败。 但是你说母字符串长度至少为10的7次方, 10M都不到,现在的系统不应该分配不出来, 除非是嵌入式小系统,内存不够。
你看看你自己到执行分配多少了?
, 从语法上来说, 字符串长度是可以无限长的.
但实际应用中, 会受到内存大小限制字符串长度.
如果是栈中分配字符串空间, 默认口有1M大小, 可以通过编译选项修改这个值 .
在堆中申请的话, 理论上来说内存条的内存还剩多大, 就是分配多大. 但实际情况需要考虑有没有这么大的连续内存.
其它静态区, 常量区也类似., 在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
, 用全局变量:
# include<stdio.h>,
# define N 100000000
char A[N],B[N];
int main(){
return 0;
}
# 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));
}
能运行 你试试]
#1
[1、编译器设定里面把栈定义加大
2、改成 char* p = new char[10000];, 不能运行的原因是你定义的该变量是局部变量吧,建议定义成全局或通过malloc/free,new/delete申请堆上的空间。
什么字符串要这么多大,不能一段一段的遍历和比较吗?这么大的空间,若用一段一段的处理会更好吧, 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
, 定义大于等于1000的数组要用new或者malloc动态申请空间, 第一点:大数组最好是动态分配;
第二点:也是一个没有分配过大数组人容易遇到的盲区,那就是字符类型的限制;举个例 char tr[n],这里的n默认是int型,那么问题就来来,int型的范围是有限制的,虽然编译不会出错,但是用的时候就会出错;所以大数组,最好先定义一个size_t 类型的数,然后再分配;例如:size_t n=1000;char tr[n*10000];
不知道我说的是不是你问的!, mallo动态申请空间不行呀,总是失败。,
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。
建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。, 局部变量使用的占内存空间,尽量别占用太多
我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的:
#include<stdio.h>
void test()
{
char *a;
a = malloc(10000000*sizeof(char));
printf("done!\n");
}
main()
{
test();
}
楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。
,
我没说malloc申请的是栈上空间,malloc申请的是堆上空间。
空间申请要根据实际需要来定,不能一下子申请太多的空间,不然会导致系统的其他功能模块运行不稳定或流畅。也会导致系统运行迟缓,
不好意思,看错了。建议与上述几位相同,局部变量不易过大,可改为static或者全局变量,在函数调用时,可再用指针访问。局部变量过大容易引起栈内存空间耗尽,尤其是在运用递归的时候。,
static定义的也是全局的,叫做静态全局变量,不过static限制了其作用域,static定义的变量的生命周期和全局变量的生命周期是一样的, 字符串的长度没有限制,但是存储字符串的内存是有限制的,具体要看你的编译环境和程序位数,在不超过机器内存和限制的情况下,局部变量的限制最大,一般只有1M左右,超过这个限制,程序无法运行,你可以使用new或者malloc来动态的申请空间,如果只是简单的小程序,可以把变量申请放在全局区域,这样内存可以申请的大一些, 既然长度“至少”10的7次方,就算申请成功了恐怕也不行的,还是仔细想想别的办法吧。, 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
字符串这么长可以放在文件里进行读取固定长度数据到缓冲区, 编译器设定里面把栈定义加大,默认是1M。
VC++堆栈默认大小是1M,如果你分配大于1M的堆,一般会出异常,这里你要把堆调大些,下面是VC++6.0与VC++2010的设置方法 http://blog.csdn.net/mingojiang/article/details/17580021, 你确定栈的空间够大?,
说明你系统里的可用内存不够,才会失败。 但是你说母字符串长度至少为10的7次方, 10M都不到,现在的系统不应该分配不出来, 除非是嵌入式小系统,内存不够。
你看看你自己到执行分配多少了?
, 从语法上来说, 字符串长度是可以无限长的.
但实际应用中, 会受到内存大小限制字符串长度.
如果是栈中分配字符串空间, 默认口有1M大小, 可以通过编译选项修改这个值 .
在堆中申请的话, 理论上来说内存条的内存还剩多大, 就是分配多大. 但实际情况需要考虑有没有这么大的连续内存.
其它静态区, 常量区也类似., 在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
, 用全局变量:
能运行 你试试]
2、改成 char* p = new char[10000];, 不能运行的原因是你定义的该变量是局部变量吧,建议定义成全局或通过malloc/free,new/delete申请堆上的空间。
什么字符串要这么多大,不能一段一段的遍历和比较吗?这么大的空间,若用一段一段的处理会更好吧, 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
, 定义大于等于1000的数组要用new或者malloc动态申请空间, 第一点:大数组最好是动态分配;
第二点:也是一个没有分配过大数组人容易遇到的盲区,那就是字符类型的限制;举个例 char tr[n],这里的n默认是int型,那么问题就来来,int型的范围是有限制的,虽然编译不会出错,但是用的时候就会出错;所以大数组,最好先定义一个size_t 类型的数,然后再分配;例如:size_t n=1000;char tr[n*10000];
不知道我说的是不是你问的!, mallo动态申请空间不行呀,总是失败。,
mallo动态申请空间不行呀,总是失败。
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。
建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。, 局部变量使用的占内存空间,尽量别占用太多
mallo动态申请空间不行呀,总是失败。
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。
建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。
我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的:
#include<stdio.h>
void test()
{
char *a;
a = malloc(10000000*sizeof(char));
printf("done!\n");
}
main()
{
test();
}
楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。
,
局部变量使用的占内存空间,尽量别占用太多
mallo动态申请空间不行呀,总是失败。
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。
建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。
我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的:
#include<stdio.h>
void test()
{
char *a;
a = malloc(10000000*sizeof(char));
printf("done!\n");
}
main()
{
test();
}
楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。
我没说malloc申请的是栈上空间,malloc申请的是堆上空间。
空间申请要根据实际需要来定,不能一下子申请太多的空间,不然会导致系统的其他功能模块运行不稳定或流畅。也会导致系统运行迟缓,
局部变量使用的占内存空间,尽量别占用太多
mallo动态申请空间不行呀,总是失败。
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。
建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。
我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的:
#include<stdio.h>
void test()
{
char *a;
a = malloc(10000000*sizeof(char));
printf("done!\n");
}
main()
{
test();
}
楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。
我没说malloc申请的是栈上空间,malloc申请的是堆上空间。
空间申请要根据实际需要来定,不能一下子申请太多的空间,不然会导致系统的其他功能模块运行不稳定或流畅。也会导致系统运行迟缓
不好意思,看错了。建议与上述几位相同,局部变量不易过大,可改为static或者全局变量,在函数调用时,可再用指针访问。局部变量过大容易引起栈内存空间耗尽,尤其是在运用递归的时候。,
局部变量使用的占内存空间,尽量别占用太多
mallo动态申请空间不行呀,总是失败。
还是太大。字符串没有长度限制,但是内存空间有限制,尤其是栈空间,是比较少的。
建议不要一次性申请那么大的空间。根据需要申请比需要的大一点的空间。
我觉得不对的,malloc申请的并非是栈内存空间,而局部变量的栈内存其实也就一个char *,没多少空间的:
#include<stdio.h>
void test()
{
char *a;
a = malloc(10000000*sizeof(char));
printf("done!\n");
}
main()
{
test();
}
楼主说malloc不行要不然代码写的有问题,要不然内存有泄漏风险(没有free),要不然PC太老配置太差,我感觉一般PC,申请10000000字节还是没问题的。
我没说malloc申请的是栈上空间,malloc申请的是堆上空间。
空间申请要根据实际需要来定,不能一下子申请太多的空间,不然会导致系统的其他功能模块运行不稳定或流畅。也会导致系统运行迟缓
不好意思,看错了。建议与上述几位相同,局部变量不易过大,可改为static或者全局变量,在函数调用时,可再用指针访问。局部变量过大容易引起栈内存空间耗尽,尤其是在运用递归的时候。
static定义的也是全局的,叫做静态全局变量,不过static限制了其作用域,static定义的变量的生命周期和全局变量的生命周期是一样的, 字符串的长度没有限制,但是存储字符串的内存是有限制的,具体要看你的编译环境和程序位数,在不超过机器内存和限制的情况下,局部变量的限制最大,一般只有1M左右,超过这个限制,程序无法运行,你可以使用new或者malloc来动态的申请空间,如果只是简单的小程序,可以把变量申请放在全局区域,这样内存可以申请的大一些, 既然长度“至少”10的7次方,就算申请成功了恐怕也不行的,还是仔细想想别的办法吧。, 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
字符串这么长可以放在文件里进行读取固定长度数据到缓冲区, 编译器设定里面把栈定义加大,默认是1M。
VC++堆栈默认大小是1M,如果你分配大于1M的堆,一般会出异常,这里你要把堆调大些,下面是VC++6.0与VC++2010的设置方法 http://blog.csdn.net/mingojiang/article/details/17580021, 你确定栈的空间够大?,
mallo动态申请空间不行呀,总是失败。
说明你系统里的可用内存不够,才会失败。 但是你说母字符串长度至少为10的7次方, 10M都不到,现在的系统不应该分配不出来, 除非是嵌入式小系统,内存不够。
你看看你自己到执行分配多少了?
, 从语法上来说, 字符串长度是可以无限长的.
但实际应用中, 会受到内存大小限制字符串长度.
如果是栈中分配字符串空间, 默认口有1M大小, 可以通过编译选项修改这个值 .
在堆中申请的话, 理论上来说内存条的内存还剩多大, 就是分配多大. 但实际情况需要考虑有没有这么大的连续内存.
其它静态区, 常量区也类似., 在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
, 用全局变量:
# include<stdio.h>,
# define N 100000000
char A[N],B[N];
int main(){
return 0;
}
# 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));
}
能运行 你试试]