你好,我有一个类似下面的代码
char *str ;
strcpy(str, "\t<");
strcat(str, time);
strcat(str, ">[");
strcat(str, user);
strcat(str, "]");
strcat(str, "(");
strcat(str, baseName);
strcat(str, ") $ ");
printf("\String is now: %s\n", str);
这段代码似乎有效,但是当我使用XCode分析函数时,它说“函数调用参数是一个未初始化的值”,它有时会导致我的程序崩溃..当我删除它,然后它工作正常...什么是错的接着就,随即?感谢
答案 0 :(得分:2)
您没有分配内存,并且str
未初始化。所有后来的写入都是通过指向“某处”的未初始化指针完成的 - 这是未定义的行为。
您必须分配(以及稍后释放)足够大的内存来保存结果字符串:
char *str = malloc( computeResultSizeSomehow() );
if( str == 0 ) {
// malloc failed - handle as fatal error
}
//proceed with your code, then
free( str );
答案 1 :(得分:2)
strcpy
和strcat
用于将字符串复制并连接到已分配的char数组。
由于str
未启动,因此您在内存中写入内容并且这很糟糕,因为您正在破坏其他数据。它可能会在那一刻起作用,但迟早你的程序会崩溃。
在声明str:
时应该分配内存 char str[100];
此外,strcat
效率不高,因为它需要搜索字符串end以了解连接字符的位置。使用sprintf
会更有效:
sprintf(str, "\t<%s>[%s](%s) $ ", time, user, baseName);
最后,如果你不能保证生成的字符串适合数组,你最好使用snsprintf。
答案 2 :(得分:1)
这是很多更简单,没有错误的缓冲区溢出:
#define BUFFERSIZE 512
char str[BUFFERSIZE];
snprintf(str, BUFFERSIZE, "\t<%s>[%s](%s) $ ", time, user, baseName);