我必须创建一个char指针数组,每个指针大小为10000000,使用最佳和优化的方法在C中执行此操作。
我相信这是最佳方式,因为只有一个动态分配,减少了堆碎片的开销和分配所需的时间。 您可以使用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; }
我认为这样做(虽然没有检查过null):
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); }
我一直在为我处理的每个请求分配50K,这导致了内存碎片。 所以我切换到分配50k * 100 = 5MB并重新使用池,我需要再分配一个。 如果请求增加超出我的池容量,我将池大小加倍以避免内存碎片。 基于此,我建议在你的情况下分配一大块内存10 * 10000000来重用它。 对不起,我不能在这里分享处理池的代码。 也使用malloc和free,不要使用new和delete。
malloc不会通过exception,如果没有可用的内存,它将只返回null。
如果你坚持单独为每个元素使用malloc,你可以创建一个最大大小的堆来避免碎片,在这种情况下你必须定义堆大小。
请向MSDN裁判,了解有关如何创建堆并使用它或Windows用户可用的其他分配方法的更多详细信息。 .aspx
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
总字节数)
以上就是c/c++开发分享如何在C中创建一个char指针数组?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/523002.html