【问题标题】:Writing to a C++ pointer in C在 C 中写入 C++ 指针
【发布时间】:2014-04-08 07:48:05
【问题描述】:

我正在使用 CppUTEST 测试一些 C 代码。 我在 C 中有一个函数 foo(int *bar),它 mallocs 一些内存,写入内存并返回到 C++ 代码。但是,当函数返回C++代码时,指针仍然是空指针。

所以这基本上就是我想做的事情

bar() {
    int *result=0;
    foo(result);
    cout << *(result+1) << endl;
}

foo(int *bar) {
   bar=(int *)malloc(sizeof(int)*4);
   *(bar+1)=2;
   *(bar+2)=5;
   return 2;
}

它是双向的,当我在 C++ 中分配内存并传递一个我写入的指针时,我只是把垃圾拿出来。

我的印象是堆分配的内存可以在任何地方写/读。

【问题讨论】:

  • 请显示代码。
  • 如果您设置bar,例如bar = malloc(42);foo 中,那么你就不会在函数外看到bar 的值。您需要进一步的间接(foo(int **bar); 或使用 int *foo() { ... return bar; }
  • C 和 C++ 将变量按值传递给函数;如果您有int *bar; foo(bar);,则不可能更改bar 的值。你需要传递一个指向bar的指针。
  • 代码或者它没有发生!

标签: c++ c malloc


【解决方案1】:

让你的函数foo返回你分配的内存块:

int *foo() {
   int *bar=(int *)malloc(sizeof(int)*4);
   *(bar+1)=2;
   *(bar+2)=5;
   return bar;
}

然后使用返回的值进行测试。不要忘记释放您使用的内存。

void bar() {
    int *result=foo();
    cout << *(result+1) << endl;
    free(result);
}

在 C++ 中调用 mallocfree 完全没问题。只需确保不要将这些函数的调用与 newdelete 运算符混淆。

【讨论】:

    【解决方案2】:

    您的代码存在许多问题,使其不适合用作 c++ 程序(内存泄漏、malloc 而不是 new、c-array 而不是 c++ 数组或向量...),但我会将其视为为指针学习 exersize。

    当您创建变量结果时,它属于“指向整数的指针”类型。指向整数的指针是内存中的地址。当您将其初始化为零时(在 c++ 中,您应该将其初始化为 nullptr),您正在给它一个占位符值。零值不是您分配的任何内存的地址。

    当您在 foo() 中调用 malloc 时,分配给 bar 的 malloc 的返回值是 malloc 分配的第一个内存元素的地址。它是一个有效的指针地址。在 foo 中,您正确地初始化了内存,但是当您返回 bar 时,变量 result 仍然被初始化为零。因此,当您尝试通过计算来访问该内存时,您访问的是地址 0+1 处的内存。

    你需要给分配结果你分配的内存地址。

    您可以: - 在 foo 之外分配内存(这更好,因为您可以让调用实体释放内存。 - 将指针传递给指针,允许您更改指针的值,而不仅仅是它指向的内存。 - 让 foo 返回它分配的内存地址,并将其分配给结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-01
      • 2023-03-24
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多