【问题标题】:Using strcat() as a parameter to a function使用 strcat() 作为函数的参数
【发布时间】:2013-08-24 12:02:50
【问题描述】:

假设我通过以下调用调用函数void foo (char* fileName);

foo("file.txt");

可以通过以下方式调用foo()

foo(strcat("file.txt",".binary"));

它会导致任何内存问题吗?据我了解,我可能面临的唯一问题是堆栈溢出,对吧?

【问题讨论】:

  • 您并没有真正将两个字符串文字连接在一起,是吗?你的实际代码是什么?
  • @TimCooper,没有实际代码,我只是想知道如果我在使用fopen() 时使用strcat(),会导致堆栈错误。

标签: c memory memory-leaks


【解决方案1】:

问题是,对于strcat,第一个参数将用于存储结果,所以它必须足够大以包含连接的结果字符串。

在你的例子中,第一个参数是一个字符串文字,不能修改,更不用说有足够的空间。

【讨论】:

    【解决方案2】:

    会导致内存问题吗?

    是的,这是未定义的行为,因此可能会导致崩溃。

    据我所知,我可能面临的唯一问题是堆栈溢出,对吧?

    不,这里的问题是strcat 会尝试写到字符串文字的末尾。

    您可以按如下方式修复您的程序:

    // Copy into writable memory, and give enough space to fit ".binary"
    char fileTxt[16] = "file.txt";
    foo(strcat(fileTxt,".binary"));
    

    此外,对于字符串文字,如果您只是将它们一个接一个地放置,编译器将为您进行连接:

    foo("file.txt" ".binary");
    

    【讨论】:

    • @Quaker 是的,这是标准的一部分,第 6.4.5.7 节。
    【解决方案3】:

    它会崩溃;在 OSX 下,我得到:

    $ ./a.out
    Abort trap: 6
    

    使用以下堆栈跟踪:

    0   libsystem_kernel.dylib          0x00007fff8ad85866 __pthread_kill + 10
    1   libsystem_pthread.dylib         0x00007fff83cb136c pthread_kill + 92
    2   libsystem_c.dylib               0x00007fff8455dbba abort + 125
    3   libsystem_c.dylib               0x00007fff8455dd31 abort_report_np + 181
    4   libsystem_c.dylib               0x00007fff845818c5 __chk_fail + 48
    5   libsystem_c.dylib               0x00007fff845818d5 __chk_fail_overlap + 16
    6   libsystem_c.dylib               0x00007fff845818f7 __chk_overlap + 34
    7   libsystem_c.dylib               0x00007fff84581c29 __strcat_chk + 81
    8   a.out                           0x0000000105c63f09 main + 57
    9   libdyld.dylib                   0x00007fff8f2255fd start + 1
    

    您正试图复制一个字符串常量,该常量通常位于只读内存中。

    【讨论】:

      【解决方案4】:

      第二个字符串的初始字节覆盖第一个字符串的空字节。所以第一个字符串(除了不是上面提到的字符串文字)应该足够大以容纳两个字符串的所有字符加上字符串字符的结尾。此外,字符串不应重叠。

      【讨论】:

        猜你喜欢
        • 2015-02-20
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 2015-02-19
        • 1970-01-01
        相关资源
        最近更新 更多