5

我有一个名为 A 的数组,其中包含随机浮点数,其大小在 [10000, 1000000] 范围内的任何位置。这个数组是我的函数的一个随机生成的参数,为了对其进行操作,我试图以一种有效的方式用 10000 个零抢先附加/填充它。我担心追加 A 分配的内存会破坏堆,所以我将新内存、memcopy A 和 memset 10000 在新数组中的尾随浮点数分配为 0.0。

void *ArrayPadder(float *A){
    int pad = 10000;
    float *Apadded = (float*)malloc((sizeof(A)+pad)*sizeof(float));
    memcpy(Apadded, A, sizeof(A));
    memset(Apadded+sizeof(A), 0.0, pad);
    return Apadded;
}

任何人都可以提出一种更有效的方法来实现这一点吗?

编辑:为延迟道歉,但我添加了一些说明。我不能只预先分配正确的内存空间(510000 个浮点数)的原因是因为数组实际上是随机大小的,包含随机浮点数。我选择 500000 是为了简化问题,现在已解决。

4

4 回答 4

6

不是一种更有效的方法,而是一种更准确的方法:

memset(Apadded+sizeof(A), 0, pad * sizeof(float));

好像 float 的大小是 4,你的代码只初始化第一个pad / sizeof(float) = 10000 / 4 = 2500 elements

请注意,我使用0而不是0.0作为第二个参数, asmemset接受一个 int 并将其(低字节)值设置为所有字节。

于 2012-11-01T20:54:53.940 回答
3

我正在尝试用 10000 个零有效地附加/填充它

追加和填充不一定是同一件事。我假设您希望将现有的内存块增加 10,000 个元素。

为什么不预先分配正确的大小并完成它呢?

#define BASE_SIZE 500000
#define PAD_SIZE  10000

/* ... */

float *data = malloc((BASE_SIZE + PAD_SIZE) * sizeof(float));
if(!data) {
    /* do something */
}

memset(data + BASE_SIZE, 0, PAD_SIZE * sizeof(float));
/* last PAD_SIZE elements are now 0 */

另请注意,memset需要设置的字节数,而不是elements,所以:

memset(Apadded+sizeof(A), 0.0, pad);

是错的。应该是pad * sizeof(float)pad是元素的数量,sizeof(float)给出每个元素的字节数。

于 2012-11-01T20:57:22.140 回答
2

这取决于如何A定义。如果它是在堆上分配的,只需使用realloc()

Apadded = realloc(A, new_size);
于 2012-11-01T20:54:26.233 回答
0

Jordan,您的代码存在一些问题。您没有显示如何A定义,但您sizeof(A)malloc调用中的使用一定是错误的。要分配扩展内存,您需要malloc,callocrealloc. realloc只能在A指向在堆上分配(例如通过 malloc)的内存区域的指针时使用。

float *Apadded = realloc(A, (number_of_entries_in_A + pad) * sizeof(float));

realloc将复制 to 的内容,AApadded会使填充区域未初始化。请注意,realloc可能会失败,在这种情况下A仍然存在并且必须稍后释放。

如果A是静态分配的,那么你需要mallocor calloccalloc将为您将内存初始化为零,但由于您要将 A 复制到 Apapped,因此很浪费。所以malloc最好。

float *Apadded = malloc((number_of_entries_in_A + pad) * sizeof(float));

请注意,number_of_entries_in_A与 不一样sizeof(A)。另请注意,C 中没有强制转换。

要初始化填充区域,您可以使用memsetwith sizeof(A)。但请注意,如果A是指针,这将失败,因为sizeof(A)只是指针的大小,而不是数组。

memcpy(Apadded, A, sizeof(A));
memset(Apadded+sizeof(A), 0, pad);

另请注意,尽管可能是这样,但可能无法保证浮点 0.0 由全零表示。

于 2012-11-01T23:12:34.807 回答