我试图在C#中使用像C中的指针.
public static void Main(string[] args)
{
unsafe
{
int i = 5;
int* j = &i;
Console.WriteLine(j); //cannot convert from 'int*' to 'bool'
}
}
Run Code Online (Sandbox Code Playgroud)
我对此代码有两个疑问:
Console.Writeline(j)要尝试转换j to bool?我想知道将固定指针从一个方法返回到另一个方法是否安全 - 固定对象是否仍然保持固定?例如
struct TestData
{
public int value;
}
public class Class1
{
private TestData data;
public unsafe TestData* GetDataPtr()
{
fixed (TestData* ptr = &data)
{
// IS THIS SAFE?
return ptr;
}
}
}
public class Class2
{
public unsafe void Test()
{
Class1 x = new Class1();
TestData* ptr = x.GetDataPtr(); // is this still fixed?
ptr->value = 2;
}
}
Run Code Online (Sandbox Code Playgroud)
我问的原因是使用这种风格的东西我一直在获得AccessViolation异常.但是因为我将它改为例如直接从Class1设定值我没有看到问题发生.
编辑:我认为可能修复的原因是,如果从"TestData*ptr = x.GetDataPtr()"之外你试图将fixed()置于"你不能获取已经修复的表达式的地址"...我现在得到它虽然它正在谈论我在"Test()"中的var"ptr"已经被修复了..
在C++中,有一个浮点值被放入int:
int value = *(int *)(&myFloatValue);
Run Code Online (Sandbox Code Playgroud)
该值将传递给我在C#中编写的程序.在运行时不知道该值是int类型还是float类型.我必须考虑这两个选项.显然,如果它是一个int,我已经拥有它.但是如果它是一个浮点数我需要更改它(不是强制转换)它的浮点值.我该怎么做呢?我尝试在C#中使用指针但是没有成功.
std::raw::Slice 定义为:
pub struct Slice<T> {
pub data: *const T,
pub len: uint,
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试这样的事情:
use std::raw::Slice as RawSlice;
let a = [1i,2,3,4];
let s : RawSlice<int>= RawSlice{data: a as *const int,
len : a.len()};
Run Code Online (Sandbox Code Playgroud)
这不编译.error: non-scalar cast: [int, ..4] as *const int.我基本上无法弄清楚如何获得指向数组开头的指针.
类似的问题是:如何从[int]转换为*const int?
我刚刚将我的Safari从Safari 9更新为safari 10 beta版.我的客户端是从页面运行的java applet.在Safari 9和版本之前,它运行正常.但在Safari 10测试版中,它失败了.我发现safari 10阻止从Java applet访问本地文件.所以我认为这是因为java插件在安全模式下运行.但在Safari - > preferences-> security-> Plug-in Settings中.没有不安全的模式选项来检查.只有三个选项:Ask,Off,On.所以我的客户端现在无法以安全模式访问本地文件.
我的mac系统是OS X El Capitan版本10.11.6,Safari版本是10.0版本
可以在Safari 10测试版中设置不安全模式吗?
我一直在尝试在Rust中编写一个直接链接到libc库的shell .我用a Vec<String>来保存要传递的参数execvp(),但似乎我的转换char **没有成功.执行时,所有参数都变为空字符串.
这是涉及的代码片段.
fn safe_execvp(path: String, argv: Vec<String>) -> Result<(), i32> {
unsafe {
let c_path = CString::new(path.as_str()).unwrap();
let mut c_argv_vec = Vec::new();
for arg in &argv {
let c_arg = CString::new(arg.as_str()).unwrap().as_ptr();
c_argv_vec.push(c_arg);
}
c_argv_vec.push(std::ptr::null());
match execvp(c_file.as_ptr(), c_argv_vec.as_ptr()) {
num => Err(num),
}
}
}
Run Code Online (Sandbox Code Playgroud)
execvp是C库函数定义为fn execvp(file: *const i8, argv: *const*const i8) -> i32;.
我不确定我做错了什么.是因为参数的内存在调用之前被释放了execvp()吗?
问题:通过获取标准库函数的地址可能会出现格式错误的行为……请参见下面的示例。因此,我正在寻找一种替代标准库函数地址的方法。
根据http://eel.is/c++draft/namespace.std#6和@Caleth 在Why function-pointer assignment work in direct assignment 但不在条件运算符中指出
“请注意,您通过获取标准库函数的地址(未指定可寻址)来依赖未指定(可能格式错误)的行为”
如本例所示:
int (*fun)(int) = std::toupper;
int t = fun('x');
Run Code Online (Sandbox Code Playgroud)
我的问题:
1) 有没有安全的方法通过指针调用(在本例中)toupper?
2) static_cast 是否使指向 std lib 函数的函数指针安全?喜欢:
int (*fun)(int) = static_cast<int(*)(int)>(std::toupper);
int t = fun('x');
Run Code Online (Sandbox Code Playgroud)
2)是否有另一种方法可以通过带有签名“int fun(int)”的单个函数来实现以下功能
bool choice = true;
int (*fun)(int);
if (choice) {
fun = std::toupper;
}
else {
fun = std::tolower;
}
int t = fun('x');
Run Code Online (Sandbox Code Playgroud) 我想问一下第一个例子是否比第二个例子慢。
示例 1:for、unsafe、unsafe、unsafe 等
for (var i = 0; i < ...; i++)
{
unsafe
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
示例 2:不安全,因为
unsafe
{
for (var i = 0; i < ...; i++)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
文档中没有任何地方涉及这方面。
题:
有人可以假设unsafe代码块的位置不会影响性能吗?
抱歉,如果问题可能重复,我既无法在此处找到,也无法使用 Google。
我是不安全 Swift 的新手,我想知道为什么 Bools 数组的大小(例如 10 个字节)仍然是 8 个字节?
如果我不能说出我的意思,我会想知道你是否可以看看这段代码:
var boolArray = [Bool]()
for _ in 1...10{
boolArray.append(true)
}
print(MemoryLayout.size(ofValue: boolArray))
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它打印 8 而数组有 10 个至少包含 10 个字节的 bool。
有没有办法在不使用 Rust 的情况下实现未定义的行为unsafe?
当然,这种行为可以由第三方库封装在“安全”函数中,所以假设我们只使用标准函数。