2

这个小程序有什么问题?我无法得到正确答案。我只是使用 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;

}
4

1 回答 1

4

这不是“C++”。是的,它是一个 C++ 代码,但它没有使用合理的 C++ 习惯用法——你混合了 C 风格memset和指针追逐operator new(这是你唯一愿意使用的 C++ 功能)。因此,我假设您有理由使用这样的代码。如果您没有,请认真考虑使用一些 STL 类,如 avector并避免指针操作。

如果您使用了合理的编译器并添加了合理的警告,您将立即收到错误:

$ 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. 这不是便携式的,很可能不是您想要做的。只是不要这样做,认真的。

于 2013-04-17T00:29:52.903 回答