这个小程序有什么问题吗?我无法得到正确的答案。我只是使用 m[1][1] 来测试,但它始终为 0!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int **m;
m = new int*[5];
for( int i = 0 ; i < 5; i++ )
{
m[i] = new int[5];
memset(m[i],1,sizeof(int)*5);
}
printf("%f",*(*(m+1)+1));
return 0;
}
最佳答案
这“不是 C++”。是的,它是 C++ 代码,但它没有使用合理的 C++ 习惯用法——您将 C 风格的 memset 和指针追逐与operator new(这是只有您碰巧使用的 C++ 功能)。因此,我假设您有理由使用这样的代码。如果您没有,请认真考虑使用一些 STL 类(例如 vector
)并避免指针操作。
如果您使用了合理的编译器并添加了合理的警告,您将立即收到错误:
$ g++ -Wall pwn.cpp
pwn.cpp: In function ‘int main()’:
pwn.cpp:14:28: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat]
用于打印整数的 printf
的正确参数是 %d
。更改后效果如何?
$ ./a.out
16843009
为什么它不打印1
? memset
函数设置内存,它不初始化整数。事实上,0x01010101 == 16843009
。这不是可移植的,而且很可能不是您想要做的。只是不要这样做,说真的。
关于c++ - 如何使用 memset 初始化动态二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16049387/