如果你编写像C++这样的函数
void readEmStar( int *arrayOfInt )
{
}
vs一个C++函数,如:
void readEmSquare( int arrayOfInt[] )
{
}
使用[方括号]和*星号之间的区别是什么,有没有人有一个风格指南,哪个是优先的,假设它们等同于编译器?
为了完整性,一个例子
void readEmStar( int *arrayOfInt, int len )
{
for( int i = 0 ; i < len; i++ )
printf( "%d ", arrayOfInt[i] ) ;
puts("");
}
void readEmSquare( int arrayOfInt[], int len )
{
for( int i = 0 ; i < len; i++ )
printf( "%d ", arrayOfInt[i] ) ;
puts("");
}
int main()
{
int r[] = { 2, …Run Code Online (Sandbox Code Playgroud) 假设您正在调用将填充字节数组的Win32函数.您创建一个大小为32的数组,为空.然后将其传递给Win32函数以填充int,稍后在托管代码中使用它.字节数组是否有可能在分配时被移动或覆盖,并且由Win32函数填充?
以下C++程序按预期编译和运行:
#include <stdio.h>
int main(int argc, char* argv[])
{
int* test = new int[10];
for (int i = 0; i < 10; i++)
test[i] = i * 10;
printf("%d \n", test[5]); // 50
printf("%d \n", 5[test]); // 50
return getchar();
}
Run Code Online (Sandbox Code Playgroud)
我能为这个问题做出的最接近的C#简单示例是:
using System;
class Program
{
unsafe static int Main(string[] args)
{
// error CS0029: Cannot implicitly convert type 'int[]' to 'int*'
int* test = new int[10];
for (int i = 0; i < 10; i++)
test[i] = i …Run Code Online (Sandbox Code Playgroud) 我不是真正的CS家伙,所以如果你们这里的任何天才能指出我正确的方向,我将永远感激.
我有一个c-code命令行函数,用于将其结果写入文件.我将它转换为通过float*数组将其数据返回到类似的C++程序(以避免常量文件I/O):
float * mgrib(int argc, char **argv)
Run Code Online (Sandbox Code Playgroud)
这非常有效.我现在需要把它变成一个C#程序,这就是事情变得混乱的地方.
我做的第一件事就是避免使用char**来使争论成为一系列的bool.如果我允许它仍然转储到文件,这工作正常.
问题是在C#中使用c风格的float数组.在c-code中,它被分配了malloc.
所以这是我尝试过的一切都没有成功(我知道数组的大小):
制作一个"免费"函数导出到C#调用,以便在完成后释放内存.经过几次循环后,C#崩溃,没有任何警告.
使用Marshal.FreeCoTaskMem从C#释放malloc.结果相同.
将float*移动到参数并删除c代码malloc.(void mgrib(...,float*data,...)
__a)使用Marshal.AllocCoTaskMem分配它.使用Marshal.FreeCoTaskMem释放它.
__b)使用Marshal.Copy进行分配.使用Marshal.FreeCoTaskMem释放它(也许这是错的?)
我已经涉足了我能在网上找到的所有东西.如果需要更多信息,请告诉我.我希望这只是一个我想念的简单概念.