读书人

请问char buf[100]的100能不能用变量替

发布时间: 2013-10-19 20:58:22 作者: rapoo

请教char buf[100]的100能不能用变量替换?
请教,对于下面的定义,buf的大小能不用用变量替代?
比如先获取一个文件的字节数,然后用这个文件的字节数替换10000000
char buf[10000000];
[解决办法]
不能,不过你可以用指针,malloc, 用完free就可以啊。
[解决办法]
不可以。 可以使用std::vector<char> 或std::array<char>


unsigned int size;
...
std::vector<char> buf(size);
char* pbuf = &buf[0];

[解决办法]
C99可以
C11可能可以
C++完全不行
[解决办法]
char buf[10000000] 编译器已经开始分配内存 ,如果你用变量 编译器不能识别,动态分配 还是用指针malloc
[解决办法]
如果是静态数组的话,数组的大小必须定义时就确定,不然编译会出问题,一般用用个计数器算出文件中包括的字节数,然后用malloc(C中的)或者new(C++)中进行程序的动态开辟,就可以了,
[解决办法]
可以动态分配 new[SIZE] 或者 malloc(SIZE)
[解决办法]
首先,
char a[1000000000];
这个 a 在栈里,应用程序的默认栈是很小的,很有可能编译通过,运行也挂了。而且,不建议在栈里放如此大的东西。

其次,在最新的C++11标准里,是支持
char a[var];
的,在GCC 4.8下

int pp = 100;
char ddd[pp];
pp++;
char ttt[pp];
for (int i = 0;i<100;i++) ddd[i] = i;
for (int i = 0;i<101;i++) ttt[i] = i;

是可以的,要打开-std=c++11选项

再次,动态分配是最好的解决方案。建议动态分配!
如果怕管理生存期,建议翻翻 shared_ptr的文档。
[解决办法]
说能用变量替换的人试试将变量的值设为2147483648
[解决办法]
仅供参考
//输出PROG中有但LIST中没有的文本行,即集合PROG-LIST
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <search.h>
#define MAXCHARS 512
int MAXLINES=10000,MAXLINES2;
char *buf,*buf2;
char PROG[256]="PROG";//程序Program需要的文件列表
char LIST[256]="LIST";//dir /b /s生成的实际文件列表List
FILE *fp,*fl;
int i,c,n,L,hh;
int ignore_case=0;
char ln[MAXCHARS];
int icompare(const void *arg1,const void *arg2) {
return stricmp((char *)arg1,(char *)arg2);
}
int compare(const void *arg1,const void *arg2) {
return strcmp((char *)arg1,(char *)arg2);
}
int main(int argc,char **argv) {
if (argc>1) strcpy(PROG,argv[1]);//命令行参数1覆盖PROG
if (argc>2) strcpy(LIST,argv[2]);//命令行参数2覆盖LIST
if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写
if ((fl=fopen(LIST,"rt"))==NULL) {
fprintf(stderr,"Can not open %s\n",LIST);
fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
return 1;
}
if ((fp=fopen(PROG,"rt"))==NULL) {
fclose(fl);
fprintf(stderr,"Can not open %s\n",PROG);
fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
return 2;
}
buf=(char *)malloc(MAXLINES*MAXCHARS);
if (NULL==buf) {
fclose(fl);
fclose(fp);
fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);
return 4;
}
n=0;
hh=0;
i=0;
while (1) {
if (fgets(ln,MAXCHARS,fl)==NULL) break;//
hh++;
L=strlen(ln)-1;
if ('\n'!=ln[L]) {//超长行忽略后面内容
fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",LIST,hh,MAXCHARS);
while (1) {
c=fgetc(fl);


if ('\n'==c
[解决办法]
EOF==c) break;//
}
}
while (1) {//去掉行尾的'\n'和空格
if ('\n'==ln[L]
[解决办法]
' '==ln[L]) {
ln[L]=0;
L--;
if (L<0) break;//
} else break;//
}
if (L>=0) {
strcpy(buf+i,ln);i+=MAXCHARS;
n++;
if (n>=MAXLINES) {
MAXLINES2=MAXLINES*2;
if (MAXLINES2==1280000) MAXLINES2=2500000;
buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);
if (NULL==buf2) {
free(buf);
fclose(fl);
fclose(fp);
fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);
return 5;
}
buf=buf2;
MAXLINES=MAXLINES2;
}
}
}
fclose(fl);
if (ignore_case) qsort(buf,n,MAXCHARS,icompare);
else qsort(buf,n,MAXCHARS,compare);
hh=0;
while (1) {
if (fgets(ln,MAXCHARS,fp)==NULL) break;//
hh++;
L=strlen(ln)-1;
if ('\n'!=ln[L]) {//超长行忽略后面内容
fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",PROG,hh,MAXCHARS);
while (1) {
c=fgetc(fp);
if ('\n'==c
[解决办法]
EOF==c) break;//
}
}
while (1) {//去掉行尾的'\n'和空格
if ('\n'==ln[L]
[解决办法]
' '==ln[L]) {
ln[L]=0;
L--;
if (L<0) break;//
} else break;//
}
if (L>=0) {
if (ignore_case) {
if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln);
} else {


if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln);
}
}
}
fclose(fp);
free(buf);
return 0;
}


[解决办法]

[解决办法]
引用:
Quote: 引用:

如果是我,一次malloc分配和要读DBF文件一样大的一块内存,将整个DBF文件读到这块内存中。
如果要写DBF,一次分配和最终要写DBF文件一样大的一块内存,将要写内容填到这块内存后,再写到文件中。

那如果DBF很大呢?比如5个G
当然实际没有那么大,几百M是有的

用文件读写模拟内存读写,5个T都行得通,只要硬盘足够大。
参考_lseeki64函数。
[解决办法]
//在堆中开辟一个6个元素的一维int数组
#include <stdio.h>
#include <malloc.h>
int *p;
int i;
void main() {
p=(int *)malloc(6*sizeof(int *));
if (NULL==p) return;
for (i=0;i<6;i++) {
p[i]=i;
}
for (i=0;i<6;i++) {
printf(" %2d",p[i]);
}
free(p);
}
// 0 1 2 3 4 5

读书人网 >C++

热点推荐