请考虑以下小示例代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *i;
char *c1, *c2;
i = malloc(4);
*i = 65535;
c1 = i;
c2 = (char *)i;
printf("%p %p %p\n", i, c1, c2);
printf("%d %d", *c1, *c2);
free(i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我分配内存来存储一个指向的整数i.然后,我存储值65535(1111 1111 1111 1111)*i.我接下来要做的是让两个char*指针也指向整数.我做了两次,但是用两种不同的方式:c1 = i;和c2 = (char *)i;.最后,我在屏幕上打印所有指针和所有值.这三个指针指向同一个地址,这两个值*c1和*c2正确(-1) .
但是,编译器会在此行中生成警告:c1 = i;.生成警告是因为我没有使用(char *)强制转换进行分配.
我想问的是为什么编译器会生成此警告,因为我没有看到使用中的任何差异c1 = i …
昨天我上课了,在某个时候讲师正在谈论C代码.他说:
在C中制作指针的目的是什么?唯一的目的是使编译器正确解释指针操作(例如,添加int指针将导致与添加char指针不同的偏移量).除此之外,没有区别:所有指针在内存中的表示方式相同,无论指针指向int值,char值,short值还是其他.因此,转换指针不会修改内存中的任何内容,它只会帮助程序员进行与其正在处理的指针类型更相关的操作.
但是,我已经阅读,特别是在Stack Overflow中,这不是100%真实.我已经读过,在一些奇怪的机器中,不同类型的指针可以以不同的方式存储在内存中.在这种情况下,如果将代码编译为此类机器,则不将指针更改为正确的类型可能会导致问题.
基本上,这是我正在谈论的那种代码.请考虑以下代码:
int* int_pointer;
char* char_pointer;
int_pointer = malloc(sizeof(int));
*int_pointer = 4;
Run Code Online (Sandbox Code Playgroud)
现在有两种选择:
1.
char_pointer = (char *)int_pointer;
Run Code Online (Sandbox Code Playgroud)
2.
char_pointer = int_pointer;
Run Code Online (Sandbox Code Playgroud)
案例2的代码可能成为一个问题?制作演员表(案例1)最终会改变内存中的指针格式(如果是的话,你能给出一个机器的例子吗?)?
谢谢
我试图在Eclipse中编译一个简单的代码时遇到错误.我正在使用jre8.
例如,当我尝试编译此代码时:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MyProject {
public static void main (String args[])
{
List<String> myList = new ArrayList<String>();
myList.add("test");
myList.add("test2");
Collections.sort(myList);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到错误Collections.sort(myList);.
错误是:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
at project.Principal.main(Principal.java:14)
Run Code Online (Sandbox Code Playgroud)
我已经打开了eclipse Build Path,删除了JRE系统库[jre8]并再次添加它.但没有奏效!我能做什么?谢谢!
PS.:在Collections.sort(myList);eclipse行显示此错误:
无法解析java.lang.CharSequence类型.它从所需的.class文件中直接引用.
我试图更深入地理解java.util.Collection和java.util.Map,但我对HashSet功能有一些疑问:
在文档中,它说:这个类实现了Set接口,由一个哈希表(实际上是一个HashMap实例)支持.好的,所以我可以看到HashSet总是在后台运行Hashtable.哈希表是一种结构,每次要向其添加新元素时都会请求键和值.然后,基于密钥hashCode将值和密钥存储在桶中.如果两个键的哈希码相同,则使用链表将两个键值添加到同一个桶中.如果我说错了,请纠正我.
所以,我的问题是:如果一个HashSet总是有Hashtable在后台运行,那么每次我们使用HashSet.add()方法向HashSet添加一个新元素时,HashSet应该将它添加到它的内部Hashtable.但是,Hashtable要求输入值和密钥,那么它使用什么密钥?它是否仅使用我们尝试添加的值作为键,然后使用其hashCode?如果我对HashSet实现说错了,请纠正我.
我的另一个问题是:一般来说,哪些类可以使用java对象的hashCode()方法?我问这个是因为,在文档中,它说我们每次覆盖equals()方法时都需要覆盖hashCode()方法.好吧,这真的很有道理,但我怀疑的是,如果只是建议我们应该做的就是保持一切"美好而完美"(以这种方式),或者如果真的有必要,因为可能有很多Java默认类会不断使用对象的hashCode()方法.在我的视野中,我看不到使用此方法的其他类而不是与集合相关的类.非常感谢你们
我知道可以查找导出的 go-plugin 符号并将它们键入 assert 到interface 中。但是,我想知道是否有办法将它们输入到结构中,例如。有没有办法做到这一点?
例如:
插件
package main
type Person struct {
Name string
}
var (
P = Person{
Name: "Emma",
}
)
Run Code Online (Sandbox Code Playgroud)
应用程序
package main
import (
"fmt"
"plugin"
"os"
)
func main() {
plug, err := plugin.Open("./plugin.so")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
sym, err := plug.Lookup("P")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
var p Person
p, ok := sym.(Person)
if !ok {
fmt.Println("Wrong symbol type")
os.Exit(1)
}
fmt.Println(p.Name) …Run Code Online (Sandbox Code Playgroud) 考虑这段代码:
int foo();
int main() {
foo();
while(1){}
}
Run Code Online (Sandbox Code Playgroud)
int foo()在共享对象中实现。
编译此代码会gcc -o main main.c -lfoo -nostdlib -m32 -O2 -e main --no-pic -L./shared给出以下diasm:
$ objdump -d ./main
./main: file format elf32-i386
Disassembly of section .plt:
00000240 <.plt>:
240: ff b3 04 00 00 00 pushl 0x4(%ebx)
246: ff a3 08 00 00 00 jmp *0x8(%ebx)
24c: 00 00 add %al,(%eax)
...
00000250 <foo@plt>:
250: ff a3 0c 00 00 00 jmp *0xc(%ebx)
256: 68 00 00 00 …Run Code Online (Sandbox Code Playgroud)