【问题标题】:Concat Arrays in CC 中的连接数组
【发布时间】:2019-05-03 11:10:17
【问题描述】:

我正在练习 C 编程。 一项任务是连接两个动态数组。第二个数组的元素应添加到第一个数组的末尾。给出如下:

void concatArrays(int* numbers1, int length1, int* numbers2, int length2)
{
  //code
}

这是我解决任务的代码:

#include <stdio.h>
#include <stdlib.h>

void concatArrays(int* numbers1, int length1, int* numbers2, int length2)
{
  numbers1 = (int*)realloc(numbers1, sizeof(int*) * (length1 + length2));
  for (int count = 0; count < length2; count++)
  {
    numbers1[length1 + count] = numbers2[count];
  }
}

int main()
{
  int* num = (int*)malloc(sizeof(int*) * 6);
  num[0] = 1;
  num[1] = 2;
  num[2] = 3;
  num[3] = 4;
  num[4] = 5;
  num[5] = 6;
  int* numbers = (int*)malloc(sizeof(int*) * 4);
  numbers[0] = 1;
  numbers[1] = 2;
  numbers[2] = 3;
  numbers[3] = 4;
  concatArrays(num, 6, numbers, 4);
  for (int count = 0; count < 10; count++)
  {
    printf("%d - ", num[count]);
  }
  return 0;
}

不幸的是,它不起作用。我知道如果我使用指向指针的指针,代码确实可以工作:

void concatArrays(int** numbers1, int length1, int** numbers2, int length2) { //code }

然而,这似乎是不允许的任务要求。

您知道如何更改我的代码以满足解决任务的要求吗?

提前谢谢你。

编辑:

我忘了:

输出: 1 - 2 - 3 - 4 - 5 - 6 - 2054454589 - 32767 - -1280384664 - 32767 -

【问题讨论】:

  • 附带说明,memcpy 是复制数据块的最佳方式。

标签: arrays c concatenation heap-memory


【解决方案1】:
void concatArrays(int* numbers1, int length1, int* numbers2, int length2)

给定的原型是按值传递的。

因此当你重新分配内存时。

  numbers1 = (int*)realloc(numbers1, sizeof(int*) * (length1 + length2));

您分配的是本地副本而不是原始副本。

注意不保证realloc返回的新指针 将与旧版本相同。

code does work if I used a pointer to a pointer.

这是因为您将通过引用传递函数内部的任何修改都会更新原始变量。


因此在main本身中分配更多的内存。

 int* num = (int*)malloc(sizeof(int) * 10);

【讨论】:

  • 感谢您的回答!它已经帮助了我。然而,根据任务,主函数不是必需的。我刚刚制作了一个用于测试目的,以查看我的代码是否有效。因此,我本身不能这样做,也不能假设给定的元素数量(在我的个人示例中为 10)。你有别的想法吗?对我有很大帮助!
  • @AnUser1 除了引用传递没有别的办法。
  • @AnUser1:虽然函数的签名保持不变,但您无法返回有用的结果。您可以将指针返回到新分配的内存(我建议保持两个数组不变,但您应该在签名中使用const int *numbers1),或者采用int **result 参数并使用它。如果您需要返回长度和数据,那么您开始考虑一个“int 数组”结构类型,就像我刚刚在对How to extract all the numbers from a string 的回答中创建的那样。
  • @JonathanLeffler 和 kiranBiradar:非常感谢!
【解决方案2】:

内存分配失败,对应类型。

注意数组的值是整数,所以通过分配它们占用的不是指针大小的内存更可能是整数大小的空间:

所以 int 数组的分配应该是这样的:

void concatArrays(int** numbers1, int* length1, const int* numbers2, const int length2)
{
    *length1 = *length1 + length2;
    *numbers1 = (int*)realloc(*numbers1, sizeof(int) * (*length1));
    ...
}

请注意,int 指针 (int*) 的大小可能与纯 int 类型的大小不同。

【讨论】:

  • 或者数组可能发生了内存填充。数组的内存大小可能不等于n * sizeof(int *)
  • 哦,我忘了第一个数组会被修改,还有它的位置,那么需要添加第一个参数作为参考:void concatArrays(int*& numbers1, int length1, int* numbers2, int length2)
  • 感谢@Osiris,用模拟的传递引用参数修复
猜你喜欢
  • 1970-01-01
  • 2021-09-24
  • 2011-01-14
  • 2014-08-06
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多