小编fel*_*eek的帖子

转换指针 - 运行时有什么区别?

请考虑以下小示例代码:

#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 pointers casting

18
推荐指数
4
解决办法
2077
查看次数

不在C中转换指针会导致问题?

昨天我上课了,在某个时候讲师正在谈论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)最终会改变内存中的指针格式(如果是的话,你能给出一个机器的例子吗?)?

谢谢

c pointers casting

13
推荐指数
2
解决办法
1599
查看次数

Eclipse错误:java.lang.CharSequence无法解析

我试图在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 eclipse

11
推荐指数
1
解决办法
5万
查看次数

HashSet如何处理hashCode()?

我试图更深入地理解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()方法.在我的视野中,我看不到使用此方法的其他类而不是与集合相关的类.非常感谢你们

java hashmap hashcode hashset

7
推荐指数
1
解决办法
6937
查看次数

是否可以在 go 插件和应用程序之间共享自定义数据类型?

我知道可以查找导出的 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)

plugins go

4
推荐指数
1
解决办法
755
查看次数

为什么 gcc 会在显然不需要的时候生成 PLT?

考虑这段代码:

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)

linux x86 assembly elf dynamic-linking

3
推荐指数
1
解决办法
2307
查看次数

标签 统计

c ×2

casting ×2

java ×2

pointers ×2

assembly ×1

dynamic-linking ×1

eclipse ×1

elf ×1

go ×1

hashcode ×1

hashmap ×1

hashset ×1

linux ×1

plugins ×1

x86 ×1