我正在使用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 ++分配内存并传递一个我写的指针时,我只是垃圾了。
我的印象是堆分配的内存可以从任何地方写入/读取。
答案 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 ++调用malloc
和free
完全可以。请确保您不要将这些功能的调用与new
和delete
运营商混淆。
答案 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返回它分配的内存地址,并将其分配给结果。