c - 在 C 主参数中使用 long** 而不是 char**

标签 c

我尝试将主要参数中的 char** 替换为 long **。但是,编译器会发出以下警告:

> add2.c:3:5: error: second parameter of 'main' (argument array) must be
>       of type 'char **' int main(int i, long **a) {

我是否可以通过添加一些 gcc 标志来编译此代码?

由于这篇文章收到了太多的反对票,我想更多地解释一下我为什么问这个问题。我有这个问题是因为我在CTF(夺旗)练习赛中遇到了这个问题。我认为这也许值得问,因为 1.它可以让人们更多地了解C main函数中的参数

  • 我用谷歌搜索了一下,以前从未见过这个问题(每个人都接受 char** 作为 C 主函数的参数)

  • 我们也许可以使用 GCcflags禁用检查,这可能有助于其他人了解更多有关 GCC 功能的信息

  • 我很抱歉这个问题收到了如此多的反对票,我不知道为什么人们反对这个问题。我觉得这个问题还是值得讨论的。

    我在服务器上成功运行了这段代码,并且我已将我的结果作为答案发布在这里。如果有人知道如何实现这项工作,我会很高兴听到。

    <小时/>
    level3@io64:/tmp$ cat add2.c
    #include <unistd.h>
    
    int main(int i, long **a) {
        if(*a[1] * 0xabcdabcdabcdu == 0x123412341234u)
            execl("/bin/sh", "sh", 0);
        return 0;
    }
    level3@io64:/tmp$ gcc -o a add2.c
    /usr/bin/ld: cannot open output file a: Permission denied
    collect2: error: ld returned 1 exit status
    level3@io64:/tmp$ gcc add2.c
    /usr/bin/ld: cannot open output file a.out: Permission denied
    collect2: error: ld returned 1 exit status
    level3@io64:/tmp$ gcc -o abc add2.c
    level3@io64:/tmp$ gcc -v -o abcd add2.c
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper
    Target: x86_64-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-5' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
    Thread model: posix
    gcc version 4.7.2 (Debian 4.7.2-5)
    COLLECT_GCC_OPTIONS='-v' '-o' 'abcd' '-mtune=generic' '-march=x86-64'
     /usr/lib/gcc/x86_64-linux-gnu/4.7/cc1 -quiet -v -imultiarch x86_64-linux-gnu add2.c -quiet -dumpbase add2.c -mtune=generic -march=x86-64 -auxbase add2 -version -o ./ccyNP1XF.s
    GNU C (Debian 4.7.2-5) version 4.7.2 (x86_64-linux-gnu)
        compiled by GNU C version 4.7.2, GMP version 5.0.5, MPFR version 3.1.0-p10, MPC version 0.9
    GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=100000
    ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
    ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include"
    #include "..." search starts here:
    #include <...> search starts here:
     /usr/lib/gcc/x86_64-linux-gnu/4.7/include
     /usr/local/include
     /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
     /usr/include/x86_64-linux-gnu
     /usr/include
    End of search list.
    GNU C (Debian 4.7.2-5) version 4.7.2 (x86_64-linux-gnu)
        compiled by GNU C version 4.7.2, GMP version 5.0.5, MPFR version 3.1.0-p10, MPC version 0.9
    GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=100000
    Compiler executable checksum: 7fa7c2a970be5e19ce72b2057c14800d
    COLLECT_GCC_OPTIONS='-v' '-o' 'abcd' '-mtune=generic' '-march=x86-64'
     as -v --64 -o ./ccJEfzc6.o ./ccyNP1XF.s
    GNU assembler version 2.22 (x86_64-linux-gnu) using BFD version (GNU Binutils for Debian) 2.22
    COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/
    LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../:/lib/:/usr/lib/
    COLLECT_GCC_OPTIONS='-v' '-o' 'abcd' '-mtune=generic' '-march=x86-64'
     /usr/lib/gcc/x86_64-linux-gnu/4.7/collect2 --sysroot=/ --build-id --no-add-needed --eh-frame-hdr -m elf_x86_64 --hash-style=both -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o abcd /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.7 -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../.. ./ccJEfzc6.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.7/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crtn.o
    

    最佳答案

    这些是唯一允许的主声明,没有 int main(int i, long **a) 并且我们无法发明一个,因为它根本不受支持。

    来自 C++ 标准,

    3.6.1 Main function

    An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both

    — a function of () returning int and

    — a function of (int, pointer to pointer to char) returning int

    关于c - 在 C 主参数中使用 long** 而不是 char**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32264097/

    相关文章:

    c - 在 C 中等待/暂停一定秒数

    c - ATMEGA 328P 变频

    c - C 中导致错误的宏参数

    iOS:使用 C/C++ 将文件写入 Documents 文件夹,并使用 Files/iTunes 或第三方工具轻松检索它

    C 程序循环行和列

    c - 让程序在用户输入值后停止

    c++ - 为什么 C-forkbombs 不像 bash 那样工作?

    c - 如何在 Linux 中显示所有用户进程 [with date, parent id, user-name]?

    检查引脚上的电压并打开 LED

    c - 传递二维数组时发出警告