【发布时间】:2011-11-15 11:58:03
【问题描述】:
我正在使用这段代码来动态创建一个二维数组:
char **FileTables;
int rows = 1000;
int i;
FileTables = (char**)malloc(rows * sizeof(char));
for (i = 0; i < rows; i++) {
FileTables[i] = (char*)malloc(256 * sizeof(char));
}
问题在于 1000 行,并且可能更多,分配所有内存需要几秒钟。 有没有更快/更好的方法来做到这一点?
编辑: 除了明显更简单的代码之外,使用其中一种方法是否有优势?
char **FileTables;
int rows = 1000;
int i;
FileTables = malloc(rows * sizeof(char*));
FileTables[0] = malloc(rows * 256 * sizeof(char));
for (i = 0; i < rows; i++) {
FileTables[i] = FileTables[0] + i * 256;
}
还有..
char (*FileTables)[256];
int rows = 1000;
FileTables = malloc(rows * sizeof(*FileTables));
(是的,我修复了不必要的强制转换)
【问题讨论】:
-
注意:您不应该在 C 中强制转换 malloc 的结果 - 这是不必要的,并且可以掩盖编译器可能会警告您的错误。
-
保罗:+1。我真的很想知道为什么人们会这样做。他们在什么时候说:“嗯,我的代码运行良好,看起来很棒。我想知道是否可以通过插入无偿演员表来添加一些噪音。
for (i = (int)0; (int)i < 12; ++(int)i)。 -
@Kerrek:
++(int)i无法编译。++需要左值,(int)i不是左值。 -
保罗:是的,确实,这是一个过度夸大的例子。公平地说,malloc-casts 通常也确实改变了类型——但没有必要这样做,因为转换已经是隐式的。
标签: c arrays performance dynamic malloc