gpt4 book ai didi

c - 返回数组的安全性

转载 作者:太空宇宙 更新时间:2023-11-04 01:37:13 25 4
gpt4 key购买 nike

假设有以下函数:

float *dosomething(const float *src, const int N)
{
float *dst = (float *)malloc(sizeof(float) * N);
if(!dst)
{
printf("Cannot allocate memory\n");
exit(EXIT_FAILURE);
}
for(int i = 0; i < N; i++)
dst[i] = src[i] * 2;
return dst;
}

在这种情况下,如果我们想使用它,就不需要事先分配内存吗?

现在,只是另一种情况:

void dosomething(float *dst, const float *src, const int N)
{
for(int i = 0; i < N; i++)
dst[i] = src[i] * 2;
}

在最后一种情况下,我们需要预先分配内存。所以我分享了它,我想知道哪种方法是返回数组的最佳方法。它们中的哪一个为库或类的用户提供了更多的安全性?最推荐哪种方法?为什么?

最佳答案

什么是更好的实践或更好的想法取决于您实际尝试做什么。

char *strdup(const char *s) (POSIX) 这样的函数的实现方式与第一种情况类似,它以一个字符串作为参数,为另一个相同长度的字符串分配内存,然后将源复制到新的内存中。它很方便,使您无需手动执行为字符串副本分配缓冲区的常见操作。您可以假设这就像调用 malloc 然后调用 strcpy/memcpy

然后你得到了一个类似char *strcpy(char *dest, const char *src) 的函数,这类似于第二种情况,你可以控制字符串的去向被复制到。这样您就不会被迫将字符串复制到动态分配的内存中,而不是您选择的内存中。

如果您需要创建和初始化某种动态结构(列表、树等),第一种方法可能会派上用场,但是第二种方法也足够了,并且可以让您控制正在使用的内存;您可以在堆上使用动态分配的内存,或在堆栈上使用局部变量等。

就个人而言,我通常会采用第二种方式,因为我可以更好地控制要初始化的变量,并且我不会被迫不得不使用新的 malloc 内存块(如果我想初始化我的局部变量怎么办?)。然后,您始终可以编写一个包装函数,该函数调用 malloc,然后使用新分配的内存作为目标调用您的函数。

这真的取决于您和您的设计以及您想要实现的目标,方法没有对错之分,只要您记得分配的内存,就不会有任何问题。我不会说两者中的任何一个更“安全”。

关于c - 返回数组的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12432866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com