首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-10-19 
请教char buf[100]的100能不能用变量替换?请教,对于下面的定义,buf的大小能不用用变量替代?比如先获取一个

请教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

热点排行