c - 使用 malloc 创建数组并将其作为函数传递
问题描述
我正在尝试学习如何使用 C(来自 C#),而 malloc 在涉及数组时一直是给我带来麻烦的事情之一。我有一个非常简单的函数来获取按非降序 { -1, 0, 1, 2, 3} ) 排序的数组,以及它的大小,对每个值进行平方,然后根据平方值按升序对其进行排序。
/// <param name="nums">integer array nums</param>
/// <param name="size">Size of array</param>
/// <returns>Sorted and squared array</returns>
int *sortedSquaredArray(int* nums, int size)
{
//Starting from both ends of the array, square and do a semi-merge sort
int *sortedArray = (int *)malloc(size * sizeof(int));
int startIdx = 0;
int endIdx = size - 1;
int cnt = size - 1;
int a;
int b;
int c;
while (startIdx < endIdx)
{
a = nums[startIdx] * nums[startIdx];
b = nums[endIdx] * nums[endIdx];
if (a >= b)
{
sortedArray[cnt] = a;
startIdx += 1;
}
else
{
sortedArray[cnt] = b;
endIdx += 1;
}
cnt -= 1;
}
//final loop
c = nums[startIdx] * nums[startIdx];
sortedArray[0] = c;
return sortedArray;
当我将数组传回并尝试打印它(我在 Visual Studio 的控制台中)时,只有最终值在 sortedArray 中设置正确,这让我认为我正在写入完全错误的内存地址,但我'不知道为什么。如果您将指针传递回另一个函数,我也不太清楚何时从 malloc 中释放已使用的内存。
/// Run the sortedSquaredArray test
/// </summary>
void runSortedSquaredArrayTest()
{
int nums1[] = { -4, -1, 0, 3, 10 };
int *res = sortedSquaredArray(nums1, 5);
printf("val1 %d, val2 %d, val3 %d, val4 %d, val5 %d", res[0], res[1], res[2], res[3], res[4]);
}
我觉得自己像个白痴,因为它能够真正手动分配内存并把它弄得一团糟:/
解决方案
正如 MikeCAT 所提到的,当您从末尾提取值时,endIdx 应该下降而不是上升。
您的“半合并排序”也有点可疑。考虑数组:
{ 2, 3, 1 }
您的算法将从比较开始和结束开始。2 > 1,所以它会将 2 放在最后。只有在此之后,它才会查看 3。这将最终为:
{ 1, 3, 2 }
如果您将指针传递回另一个函数,我也不太清楚何时从 malloc 中释放已使用的内存。
在实现时,您的函数分配内存并为调用者创建一个义务,当他们完成使用它时释放它。这类似于调用“open”如何使调用者有义务稍后调用“close”。为了解决这个问题,你的runSortedSquaredArrayTest
函数应该以free(res);
. 实现这一点的另一种方法是让调用者提供他们想要放置输出的内存。调用时,这可能如下所示:
void sortedSquaredArray(int length, int* input, int* output) {...}
void runSortedSquaredArrayTest()
{
int input[] = { -4, -1, 0, 3, 10 };
int output[] = { 0, 0, 0, 0, 0 };
sortedSquaredArray(5, input, output);
printf("val1 %d, val2 %d, val3 %d, val4 %d, val5 %d", output[0], output[1], output[2], output[3], output[4]);
}
使用这种方法,调用者不需要释放任何东西。
推荐阅读
- kotlin - 如何 mvvm 数据绑定 tablayout 项目单击
- performance - Google Lighthouse Metrics 与速度指数得分不匹配
- ruby-on-rails - Rails DateTime.now 和 Date.current 返回过去两周的日期
- iis - 如何使 IIS 在环境之间保持一致?
- python - 组合图表 - 相同的 y 轴 - 与 Openpyxl
- deep-learning - Tensorflow2_Object_detection | 数据增强
- reactjs - 我正在尝试在反应 js 中使用 Bootsrap 5 创建导航栏,但我的下拉按钮不起作用
- php - 禁止访问者通过 URL 访问目录并在网站需要时重定向到特定页面而不阻止内部访问?
- mysql - 如何在 mysql 中保存客户(来宾)帐户详细信息?
- node.js - 调用函数时在 NodeJS 中返回 Promise { undefined }