使用strcat()作为函数的参数

时间:2013-08-24 12:02:50

标签: c memory memory-leaks

假设我使用以下调用

调用函数void foo (char* fileName);
foo("file.txt");

是否可以通过以下方式致电foo()

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

会导致任何内存问题吗?据我所知,我可以面对的唯一问题是堆栈溢出,对吗?

4 个答案:

答案 0 :(得分:2)

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

在您的示例中,第一个参数是字符串文字,无法修改,也就是说没有足够的空间。

答案 1 :(得分:1)

  

会不会引起任何内存问题?

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

  

据我所知,我可以面对的唯一问题是堆栈溢出,对吗?

不,这里的问题是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");

答案 2 :(得分:1)

会崩溃;在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

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

答案 3 :(得分:1)

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