sprintf出现意外行为

时间:2015-07-20 16:02:05

标签: c printf allocation

我正在写一个程序,我有一个非常奇怪的问题。

char *abs_alg *iterator *test_case;
sprintf(abs_alg, "%s/data_root/projects/PROJ-%s/proj/src/%sAbsAlgorithm.cpp", getenv(ALGATOR_ROOT), argv[2], argv[2]);
sprintf(iterator, "%s/data_root/projects/PROJ-%s/proj/src/%sTestSetIterator.cpp", getenv(ALGATOR_ROOT), argv[2], argv[2]);
sprintf(test_case, "%s/data_root/projects/PROJ-%s/proj/src/%sTestCase.cpp", getenv(ALGATOR_ROOT), argv[2], argv[2]);

在最后一行中,我收到运行时错误: 线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x3)

前两个sprintf函数工作正常,但最后一个不是。另外,如果我将* char test_case更改为char test_case [500] ,那么在此行中的程序之前我会收到错误:

char *lib_dir;
sprintf(lib_dir, "%s/data_root/projects/PROJ-%s/lib/", getenv(ALGATOR_ROOT), argv[2]);

我正在使用XCode-beta 7.0。

g++ --version
Configured with: --prefix=/Applications/Xcode-beta.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/c++/4.2.1
Apple LLVM version 7.0.0 (clang-700.0.53.3)
Target: x86_64-apple-darwin15.0.0
Thread model: posix

我一直在努力解决这个问题,但没有成功。我很感激能得到的任何帮助。

1 个答案:

答案 0 :(得分:1)

sprintf不为返回的字符串分配内存(在您的情况下为lib_dir)。

假设答案最多为256个字符,您应该写:

char lib_dir[256];
sprintf(lib_dir, "%s/data_root/projects/PROJ-%s/lib/", getenv(ALGATOR_ROOT), argv[2]);

如果您不确定尺寸限制,可以查看有关sprintf() with automatic memory allocation的问题。