0

我必须使用最佳和优化的方法在 C 中创建一个大小为 10000000 的 char 指针数组。

4

4 回答 4

4

我认为这会做(虽然没有检查空值):

int i;
int num_arrays;
char **huge_char_array;
num_arrays = 10; //number of arrays you want.
huge_char_array = (char **)malloc(sizeof(char *) * num_arrays);
for(i = 0; i < num_arrays; i++)
{
    huge_char_array[i] = (char *)malloc(sizeof(char) * 10000000);
}
于 2012-08-10T19:48:03.110 回答
2

我相信这是最佳方式,因为只有一个动态分配,减少了堆碎片带来的开销和分配时间。您可以使用 STRING_INDEX 实用函数来访问第 n 个字符串。

此外,使用 calloc() 而不是 malloc() 将缓冲区清零以确保所有字符串都是 NUL 终止的。

#define STRING_SIZE 10000000
#define NUM_STRINGS 10

#define STRING_INDEX(array, string_idx) ((array) + (string_idx) * STRING_SIZE)

int main(int argc, char **argv) {
    char *array_of_strings = calloc(NUM_STRINGS, STRING_SIZE);

    // Access 8th character of 7th string
    char c = STRING_INDEX(array_of_strings, 7)[8];

    // Use array

    // Free array when done
    free(array_of_strings);

    return 0;
}
于 2012-08-10T19:53:41.503 回答
1
char *arr[SOME_SIZE];
for(int i = 0; i < SOME_SIZE; ++i) {
    arr[i] = malloc(10000000);
    if(!arr[i])
        // allocation failed, do something
}

只需意识到您为数组中的每个元素分配了 ~9.5MB (即SOME_SIZE * 10000000总字节数)

于 2012-08-10T19:46:36.093 回答
1

我处理的每个请求都分配了 50K,这导致了内存碎片。所以我切换到分配 50k * 100 = 5MB 并在需要再分配一个时重用池。如果请求增加到超出我的池容量,我将池大小加倍以避免内存碎片。基于此,我建议在您的情况下分配大量内存 10 * 10000000 以重用它。很抱歉,我不能在这里分享处理池的代码。还要使用 malloc 和 free,不要使用 new 和 delete。

malloc 不会通过异常,如果没有可用内存,它只会返回 null 。

如果您坚持对每个元素单独使用 malloc,您可以创建一个具有最大大小的堆以避免碎片,在这种情况下,您将必须定义堆大小。

请参考 MSDN 以获取有关如何创建和使用堆或 Windows 用户可用的其他分配方法的更多详细信息。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa366533(v=vs.85).aspx

于 2012-08-10T19:49:52.800 回答