gpt4 book ai didi

c - 将参数传递给 argv 指针的最短方法

转载 作者:行者123 更新时间:2023-12-04 09:46:11 24 4
gpt4 key购买 nike

我编写了三种将参数传递给接受 argv 参数的函数的方法。

  • 使用字符串文字的第一种方法最短且工作正常,但由于我的测试工具是基于 cpp 的,因此给了我一个已弃用的警告:
  • error: conversion
    from string literal to 'char *' is deprecated
    [-Werror,-Wc++11-compat-deprecated-writable-strings]
  • 使用 malloc 的方法有效,虽然它有点长。
  • 最后一种方法会导致段错误。你能帮我找出第三种方法中的错误,我创建一个预定义大小的数组并复制内容吗?为什么会失败?
  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define TEST3

    int console_tester(int argc, char *argv[])
    {
    printf("argv: %s\n", argv[0]);
    return 0;
    }

    int main()
    {

    #ifdef TEST1
    // works, shortest, but gives compilation warnings
    char *test_cmd[2] = {"hello1", "hello2"};
    int result = console_tester(2, (char**)test_cmd);
    #endif

    // works, verbose
    #ifdef TEST2
    char *test_cmd[2];
    test_cmd[0] = malloc(10);
    test_cmd[1] = malloc(10);
    memset(test_cmd[0], 0, 10);
    memset(test_cmd[0], 1, 10);
    memcpy(test_cmd[0], "hello1", sizeof("hello1"));
    memcpy(test_cmd[1], "hello2", sizeof("hello2"));
    int result = console_tester(2, (char**)test_cmd);
    free(test_cmd[0]);
    free(test_cmd[1]);
    #endif

    // crash and burn
    #ifdef TEST3
    char test_cmd[2][10];
    memset(&test_cmd[0], 0, 10);
    memset(&test_cmd[1], 0, 10);
    memcpy(&test_cmd[0], "hello1", sizeof("hello1"));
    memcpy(&test_cmd[1], "hello2", sizeof("hello2"));
    int result = console_tester(2, (char**)test_cmd);
    #endif

    return 0;
    }

    最佳答案

    在第三个示例中,您正在执行无效转换:

    char test_cmd[2][10];
    memset(&test_cmd[0], 0, 10);
    memset(&test_cmd[1], 0, 10);
    memcpy(&test_cmd[0], "hello1", sizeof("hello1"));
    memcpy(&test_cmd[1], "hello2", sizeof("hello2"));

    int result = console_tester(2, (char**)test_cmd);

    当我去掉 (char**) 时,这会为我生成一个编译器警告。蛮力类型转换:
    warning: incompatible pointer types passing 'char (*)[10]' to parameter of type 'char **' [-Wincompatible-pointer-types]

    这真的应该是一个错误。不能随意切换。您没有要传入的正确类型的结构,因此您必须先将其转换为正确的结构。

    另外两个例子都使用 char**正确所以他们很好。

    这就是为什么打开编译器必须提供的所有警告可以帮助快速缩小问题范围的原因。 C,通过扩展 C++,真的不在乎你是否要求做一些无效的事情,如果被告知去做,它就会去做,然后因此崩溃或表现得非常奇怪。

    关于c - 将参数传递给 argv 指针的最短方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62098328/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com