1

在 C 中,如何重置给定指针以使数组中的所有值都是指定值?最好使用 for 循环,还是有一个函数可以用来将数组中的所有值设置为 0。

我的代码目前是这样的:

int main()
{
     double *my_values = calloc(10, sizeof(double));
     do_something_with_values(my_values);

     free(my_values);
     my_values = calloc(10, sizeof(double));

     do_something_else_with_values(my_values);
     free(my_values);
}

这(对我来说)似乎很老套,我该如何改进这段代码?

4

8 回答 8

5

memset 可以将数组设置为全零或您想要的任何值

于 2011-03-18T17:00:19.403 回答
4

该代码不仅仅是hacky,它可能导致严重且难以重现的错误。

通过执行一个free然后一个新的calloc调用,您不能保证将相同的内存空间分配给您的数组,如果您在执行此操作之前有一个指向该数组的指针并稍后尝试使用它,这可能是一个问题。

于 2011-03-18T17:01:04.843 回答
1

如果这真的总是像您的示例中那样与固定大小的数组有关,那么您的分配可能已经走错了路。最好做

int main(void) // <- this is the correct signature
{
     double my_values[10] = { 0 };
     do_something_with_values(my_values);

     memcpy(my_values, (const double[10]){0}, 10*sizeof(double));

     do_something_else_with_values(my_values);
}

0.0此处的定义和初始化可确保在您运行它的任何架构上使用正确的值初始化数组。重新初始化memcpy也是如此。它使用复合文字来实现这一点。对于该部分,您必须有一个符合 C99 的编译器。

于 2011-03-18T17:43:09.043 回答
0

对于初始化,您可以简单地使用:

double myarray[100] = {0};
于 2011-03-18T17:42:30.490 回答
0

曾几何时,那是 1975 年,有人开始为一种名为 C 的全新编程语言编写库。如果你有超过 64KB 的 RAM,你就可以使用世界上最大的超级计算机之一。

因此,当设计像这样的例程时memset(),没有人可以想象您可能想要初始化大于 8 位字节的东西。一个字节在当时是巨大的。

如果你需要更大的东西,你必须编写自己的循环。从积极的方面来说,当所有字节都为 0 时,所有 C 类型都为零。因此,您可以使用calloc()或从其他地方获取内存并使用memset(ptr, 0, size);

于 2011-03-18T17:03:38.983 回答
-1

使用memset

memset(my_values, 0, 10 * sizeof(double));
于 2011-03-18T17:02:03.253 回答
-1

我可能完全不在这里,但是:我会使用 memset。

http://www.linuxmanpages.com/man3/memset.3.php

于 2011-03-18T17:03:02.237 回答
-1

最简单的方法可能是使用memset

    memset( the_array, '\0', sizeof(the_array) );

这将使您的整个数组归零

于 2011-03-18T17:00:43.030 回答