strcpy和strcat有时会引起问题

时间:2011-08-31 08:51:12

标签: strcpy strcat

你好,我有一个类似下面的代码

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分析函数时,它说“函数调用参数是一个未初始化的值”,它有时会导致我的程序崩溃..当我删除它,然后它工作正常...什么是错的接着就,随即?感谢

3 个答案:

答案 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)

strcpystrcat用于将字符串复制并连接到已分配的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);