c编程更有效地使用大数组

时间:2017-10-28 19:49:52

标签: c arrays

如何让这些大阵列更有效率?我添加它时会出现分段错误,但是当我删除它们时,分段错误就会消失。我有几个这样没有显示的大数组。我需要数组来处理我正在阅读的文件。在下面的代码中,我使用stdin而不是我通常使用的文件指针。我也在使用后释放每个大阵列。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main(void) {
    int players_column_counter = 0;
    int players_column1[100000] = {0};
    char *players_strings_line_column2[100000] = {0};
    char *players_strings_line_column3[100000] = {0};
    char *players_strings_line_column4[100000] = {0};
    char *players_strings_line_column5[100000] = {0};
    char *players_strings_line_column6[100000] = {0};
    char line[80] = {0};


    while(fgets(line, 80, stdin) != NULL)
    {
        players_strings_line_column2[players_column_counter] = 
        malloc(strlen("string")+1);

        strcpy(players_strings_line_column2[players_column_counter], 
        "string");
        players_column_counter++;
    }

    free(*players_strings_line_column2);
    free(*players_strings_line_column3);
    free(*players_strings_line_column4);
    free(*players_strings_line_column5);
    free(*players_strings_line_column6);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

详细了解C dynamic memory allocation。学习使用malloc and calloc and free。请注意malloccalloc(和realloc)可能会失败,您需要处理它。请参阅thisthat

call stack的大小有限(通常为一个或几个兆字节;实际限制是操作系统和计算机特定的)。有一个超过几千字节的调用帧是不合理的。但是callocmalloc可能允许分配几千兆字节(实际限制取决于您的系统),或者当前笔记本电脑或台式机上至少数百兆字节。本地 - automatic variable - 超过几百个元素的数组几乎总是错误的(并且肯定是非常难闻的气味)。

顺便说一句,如果您的系统有getline(3),您可能应该使用它(例如here)。同样适用于strdup(3)asprintf(3)

如果您的系统没有getlinestrdupasprintf,您应该考虑实施它们,或借用它们的一些免费软件实现。

编译所有警告和调试信息(例如gcc -Wall -Wextra -gGCC)。改进您的代码以获得警告。 使用调试器 gdb(和valgrind)。谨防undefined behavior(例如buffer overflow s)和memory leaks

研究现有free software的源代码(例如,在github和/或某些Linux distribution上)以获取灵感。