如何动态更改char指针大小?

时间:2013-03-04 12:07:24

标签: c pointers

我使用realloc动态增加char指针(* seqA)的大小。还有另外一种方法吗?

这是我的代码的一部分:

    while((holder=fgetc(fileA)) != EOF) {
    lenA++;
    temp=(char*)realloc(seqA,lenA*sizeof(char));
    if (temp!=NULL) {
        seqA=temp;
    seqA[lenA-1]=holder;
    }
    else {
        free (seqA);
        puts ("Error (re)allocating memory");
        exit (1);
    }
}

2 个答案:

答案 0 :(得分:1)

当您的代码将整个文件读入字符串时,为什么不使用以下代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

....

struct stat buf;
fstat(fileno(fileA), &buf);
seqA = malloc(buf.st_size);
fread(seqA, buf.st_size, 1, fileA);

当然,您应该检查这些功能的返回值并采取适当的措施。

答案 1 :(得分:0)

为什么质疑你算法的这么一小部分?对整个算法进行更全面的观察可能是一个更好的主意。您当前的算法取决于这个相当密集和不必要的代码。如果您可以消除将整个文件读入内存的依赖性,那么您的解决方案将具有更高的可扩展性。也许通过“一种更好地做到这一点的方式”,你的意思是“更快”或“所以我可以处理100GB大小的文件而不会停止”。

考虑一个finite state machine,它可以一次一个字节地从文件中读取,处理和提取所需信息。你可能不需要malloc这么多。如果没有对问题的具体描述,我们无法帮助您派生有限状态机来解决您的问题。但是,一个突出的例子可能是在100GB文件中找到一个最大整数:

while (fscanf(file, "%d", &current_num) == 1) {
    if (current_num > max_num) {
        max_num = current_num;
    }
}

这段代码显然不需要malloc,更不用说将整个文件读入内存了;无论文件大小如何,它都只会使用恒定的内存量。