在C中写入C ++指针

时间:2014-04-08 07:48:06

标签: c++ c malloc

我正在使用CppUTEST来测试一些C代码。 我在C中有一个函数foo(int *bar)malloc是一些内存,写入内存并返回到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 ++分配内存并传递一个我写的指针时,我只是垃圾了。

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

2 个答案:

答案 0 :(得分: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运营商混淆。

答案 1 :(得分:0)

你的代码有很多问题使它不适合作为c ++程序(内存泄漏,malloc而不是new,c-array而不是c ++数组或vector ...),但我会对待的是作为一个学习exersize指针。

当你创建变量结果时,它是一个&#34;指向整数&#34;的指针。指向内部的指针是内存中的地址。当你将它初始化为零时(在c ++中你应该将它初始化为nullptr),你给它一个占位符值。零值不是您分配的任何内存的地址。

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

您需要为分配结果指定已分配内存的地址。

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