user-0 提问: 数组太大时生成失败

回复:
user: user-1
content: 引用 2 楼 doubyZZ 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 建议在堆上申请大缓存。使用malloc, realloc, calloc 栈的空间是有限的，函数栈的空间更是有限的。 堆上的空间相对栈而言，是比较可观的。用完，记着手动释放。 malloc申请成功后，数组怎么存进去呢？ 例如: int *p; p=(int*)malloc(633*475*sizeof(int)); （然后我是不是还是要定义一个数组） int a[633][475]={.................}; p=a[0]; 不知道是不是我想法有问题，望指出，谢谢！[/quote]  直接使用malloc申请得到的空间（你上面代码中的p）代替数组  后面直接使用p，不需要再int a[633][475]

user: user-0
content: 引用 7 楼 qq_36409192 的回复:[quote=引用 2 楼 doubyZZ 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 建议在堆上申请大缓存。使用malloc, realloc, calloc 栈的空间是有限的，函数栈的空间更是有限的。 堆上的空间相对栈而言，是比较可观的。用完，记着手动释放。 malloc申请成功后，数组怎么存进去呢？ 例如: int *p; p=(int*)malloc(633*475*sizeof(int)); （然后我是不是还是要定义一个数组） int a[633][475]={.................}; p=a[0]; 不知道是不是我想法有问题，望指出，谢谢！[/quote]   引用 2 楼 doubyZZ 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 建议在堆上申请大缓存。使用malloc, realloc, calloc 栈的空间是有限的，函数栈的空间更是有限的。 堆上的空间相对栈而言，是比较可观的。用完，记着手动释放。 malloc申请成功后，数组怎么存进去呢？ 例如: int *p; p=(int*)malloc(633*475*sizeof(int)); （然后我是不是还是要定义一个数组） int a[633][475]={.................}; p=a[0]; 不知道是不是我想法有问题，望指出，谢谢！[/quote] 楼主想说的是不是malloc一个二维数组？ 	int **p; 	p=(int **)malloc(633 * sizeof (int *)); 	for(int i = 0; i < 633; i++) 	{ 		p[i]=(int *)malloc(475 * sizeof(int)); 	}[/quote]解了我一个大惑，谢谢啊

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 // 非常感谢 ！

user: user-0
content: 引用 9 楼 cfjtaishan 的回复:[quote=引用 6 楼 doubyZZ 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] [quote=引用 2 楼 doubyZZ 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 建议在堆上申请大缓存。使用malloc, realloc, calloc 栈的空间是有限的，函数栈的空间更是有限的。 堆上的空间相对栈而言，是比较可观的。用完，记着手动释放。 malloc申请成功后，数组怎么存进去呢？ 例如: int *p; p=(int*)malloc(633*475*sizeof(int)); （然后我是不是还是要定义一个数组） int a[633][475]={.................}; p=a[0]; 不知道是不是我想法有问题，望指出，谢谢！[/quote] malloc之后，你把p当成数组使用就可以了。[/quote]请问是直接p[633][475]={..........};这样赋值吗？[/quote] 申请了633 × 475个sizeof(int)的长度，这是一个一维数组，不要当成二维数组。[/quote]明白了，谢谢！果然还是对指针似懂非懂

user: user-2
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-3
content: 引用 6 楼 doubyZZ 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] [quote=引用 2 楼 doubyZZ 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 建议在堆上申请大缓存。使用malloc, realloc, calloc 栈的空间是有限的，函数栈的空间更是有限的。 堆上的空间相对栈而言，是比较可观的。用完，记着手动释放。 malloc申请成功后，数组怎么存进去呢？ 例如: int *p; p=(int*)malloc(633*475*sizeof(int)); （然后我是不是还是要定义一个数组） int a[633][475]={.................}; p=a[0]; 不知道是不是我想法有问题，望指出，谢谢！[/quote] malloc之后，你把p当成数组使用就可以了。[/quote]请问是直接p[633][475]={..........};这样赋值吗？[/quote] 申请了633 × 475个sizeof(int)的长度，这是一个一维数组，不要当成二维数组。

user: user-3
content: 引用 6 楼 doubyZZ 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] [quote=引用 2 楼 doubyZZ 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 建议在堆上申请大缓存。使用malloc, realloc, calloc 栈的空间是有限的，函数栈的空间更是有限的。 堆上的空间相对栈而言，是比较可观的。用完，记着手动释放。 malloc申请成功后，数组怎么存进去呢？ 例如: int *p; p=(int*)malloc(633*475*sizeof(int)); （然后我是不是还是要定义一个数组） int a[633][475]={.................}; p=a[0]; 不知道是不是我想法有问题，望指出，谢谢！[/quote] malloc之后，你把p当成数组使用就可以了。[/quote]请问是直接p[633][475]={..........};这样赋值吗？[/quote] 可以，注意不要越界。

user: user-4
content: 引用 2 楼 doubyZZ 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 建议在堆上申请大缓存。使用malloc, realloc, calloc 栈的空间是有限的，函数栈的空间更是有限的。 堆上的空间相对栈而言，是比较可观的。用完，记着手动释放。 malloc申请成功后，数组怎么存进去呢？ 例如: int *p; p=(int*)malloc(633*475*sizeof(int)); （然后我是不是还是要定义一个数组） int a[633][475]={.................}; p=a[0]; 不知道是不是我想法有问题，望指出，谢谢！[/quote]   引用 2 楼 doubyZZ 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 建议在堆上申请大缓存。使用malloc, realloc, calloc 栈的空间是有限的，函数栈的空间更是有限的。 堆上的空间相对栈而言，是比较可观的。用完，记着手动释放。 malloc申请成功后，数组怎么存进去呢？ 例如: int *p; p=(int*)malloc(633*475*sizeof(int)); （然后我是不是还是要定义一个数组） int a[633][475]={.................}; p=a[0]; 不知道是不是我想法有问题，望指出，谢谢！[/quote] 楼主想说的是不是malloc一个二维数组？ 	int **p; 	p=(int **)malloc(633 * sizeof (int *)); 	for(int i = 0; i < 633; i++) 	{ 		p[i]=(int *)malloc(475 * sizeof(int)); 	}

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:[quote=引用 2 楼 doubyZZ 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 建议在堆上申请大缓存。使用malloc, realloc, calloc 栈的空间是有限的，函数栈的空间更是有限的。 堆上的空间相对栈而言，是比较可观的。用完，记着手动释放。 malloc申请成功后，数组怎么存进去呢？ 例如: int *p; p=(int*)malloc(633*475*sizeof(int)); （然后我是不是还是要定义一个数组） int a[633][475]={.................}; p=a[0]; 不知道是不是我想法有问题，望指出，谢谢！[/quote] malloc之后，你把p当成数组使用就可以了。[/quote]请问是直接p[633][475]={..........};这样赋值吗？

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 容量大小从小到大：栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB～1TB左右的存储时，最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数，linux参考fseeko64函数。 FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000]; int B; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999]; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B; fclose(fA);存到全局数据段就成功了，非常感谢！！！！！

user: user-3
content: 引用 2 楼 doubyZZ 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 建议在堆上申请大缓存。使用malloc, realloc, calloc 栈的空间是有限的，函数栈的空间更是有限的。 堆上的空间相对栈而言，是比较可观的。用完，记着手动释放。 malloc申请成功后，数组怎么存进去呢？ 例如: int *p; p=(int*)malloc(633*475*sizeof(int)); （然后我是不是还是要定义一个数组） int a[633][475]={.................}; p=a[0]; 不知道是不是我想法有问题，望指出，谢谢！[/quote] malloc之后，你把p当成数组使用就可以了。

user: user-2
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 容量大小从小到大：栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB～1TB左右的存储时，最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数，linux参考fseeko64函数。 FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000]; int B; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999]; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B; fclose(fA);

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:建议在堆上申请大缓存。使用malloc, realloc, calloc 栈的空间是有限的，函数栈的空间更是有限的。 堆上的空间相对栈而言，是比较可观的。用完，记着手动释放。 malloc申请成功后，数组怎么存进去呢？ 例如: int *p; p=(int*)malloc(633*475*sizeof(int)); （然后我是不是还是要定义一个数组） int a[633][475]={.................}; p=a[0]; 不知道是不是我想法有问题，望指出，谢谢！

user: user-3
content: 建议在堆上申请大缓存。使用malloc, realloc, calloc 栈的空间是有限的，函数栈的空间更是有限的。 堆上的空间相对栈而言，是比较可观的。用完，记着手动释放。