小编tom*_*aas的帖子

堆污染,java

List l = new ArrayList<Number>();
List<String> ls = l;       // unchecked warning
l.add(0, new Integer(42)); // another unchecked warning
String s = ls.get(0);      // ClassCastException is thrown
Run Code Online (Sandbox Code Playgroud)

java文档说;

此外,调用l.add方法时会发生堆污染情况.add方法静态类型第二个形式参数是String,但是使用不同类型的实际参数Integer调用此方法.但是,编译器仍允许此方法调用.由于类型擦除,add方法的第二个形式参数的类型(定义为List.add(int,E))变为Object.因此,编译器允许此方法调用,因为在类型擦除之后,l.add方法可以添加任何Object类型的对象,包括Integer类型的对象

我的问题是关于我大胆的部分.据我所知,在第2行堆污染发生导致l引用List引用类型为List的对象.但是当调用add方法时,l引用不应该期望Number类型而不是String,因为l是对ArrayList的引用.或者是,在ls = l之后,堆中的空间List<String>也是为了引用?在这种情况下,有意义的是java docs在粗体部分中所说的内容

java generics

6
推荐指数
1
解决办法
415
查看次数

堆栈,esp寄存器

我从一本书中复制了这段代码.在每个评论中我都放了一个数字,然后问你问题(1,2,3,4)与该数字评论的代码行有关.希望它没问题.

1)ESP指向这些缓冲值.为什么我们在这里看不到'A'的0x41 ????

2)ESP指向标记变量存储器,该变量存储器必须包含31337,其中十六进制为0x7a69.为什么它包含这个号码0xbffff89c ???

3)指向前一个堆栈帧指针,这种情况下包含一个正确的地址.

4)寄回地址.也正确.

5)争论.也正确的值.

那么1)和2)会发生什么?它是否填充?

非常感谢.

void test_function(int a, int b, int c, int d) {
  int flag;
  char buffer[10];
  flag = 31337;
  buffer[0] = 'A';
}

int main() {
  test_function(1, 2, 3, 4);
}


GDB debug session
Breakpoint 2, test_function (a=1, b=2, c=3, d=4) at stack_example.c:5
5 flag = 31337;
(gdb) i r esp ebp eip
esp 0xbffff7c0 0xbffff7c0
ebp 0xbffff7e8 0xbffff7e8
eip 0x804834a 0x804834a <test_function+6>
(gdb) disass test_function
Dump of assembler code for function …
Run Code Online (Sandbox Code Playgroud)

c assembly

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

c语法在两个不同的行中?

我有关于c语法的这个简单问题.当我们写:

  printf("hello world
  ");
Run Code Online (Sandbox Code Playgroud)

编译器产生错误.为什么?在另一个案例中:

  for (i = 0; i < MAXLINE - 1      
  && (c=getchar)) != EOF && c != '\n'; ++i)
Run Code Online (Sandbox Code Playgroud)

一切都很好.这一切的一般规则是什么?

谢谢 !

c coding-style

0
推荐指数
1
解决办法
85
查看次数

标签 统计

c ×2

assembly ×1

coding-style ×1

generics ×1

java ×1