1

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

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 分析函数时,它说“函数调用参数是一个未初始化的值”,而且它有时会导致我的程序崩溃..当我删除它时,它工作正常......那有什么问题?谢谢

4

3 回答 3

4

strcpystrcat用于将字符串复制并连接到分配的 char 数组。

由于str在未初始化的情况下,您正在内存中的某个位置进行写入,这很糟糕,因为您正在破坏其他数据。它可能在那一刻起作用,但迟早你的程序会崩溃。

您应该在声明 str 时分配内存:

char str[100];

此外,strcat效率不高,因为它需要搜索字符串结尾才能知道连接字符的位置。使用sprintf会更有效:

sprintf(str, "\t<%s>[%s](%s) $ ", time, user, baseName);

最后,如果不能保证生成的字符串适合数组,最好使用snsprintf。

于 2011-08-31T09:02:47.393 回答
2

您不分配内存并且str未初始化。所有后来的写入都是通过指向“某处”的未初始化指针完成的——这是未定义的行为。

您必须分配足够大的内存(然后释放)以保存结果字符串:

char *str = malloc( computeResultSizeSomehow() );
if( str == 0 ) {
   // malloc failed - handle as fatal error
}

//proceed with your code, then

free( str );
于 2011-08-31T08:53:36.407 回答
2

简单,并且不会因缓冲区溢出而出错:

#define BUFFERSIZE 512
char str[BUFFERSIZE];

snprintf(str, BUFFERSIZE, "\t<%s>[%s](%s) $ ", time, user, baseName);
于 2011-08-31T09:01:04.313 回答