【问题标题】:strcpy and strcat cause problems sometimesstrcpy 和 strcat 有时会导致问题
【发布时间】:2011-11-07 10:51:53
【问题描述】:

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

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

【问题讨论】:

  • 你为str分配内存了吗?
  • @kanoz:这很重要,因为除了合法分配的内存之外,您不能写入任何内容。
  • 为了将来参考,str 通常被称为 danglingwild 指针:en.wikipedia.org/wiki/Dangling_pointer

标签: strcpy strcat


【解决方案1】:

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

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

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

char str[100];

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

sprintf(str, "\t&lt;%s&gt;[%s](%s) $ ", time, user, baseName);

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

【讨论】:

    【解决方案2】:

    很多更简单,并且不会出现缓冲区溢出错误:

    #define BUFFERSIZE 512
    char str[BUFFERSIZE];
    
    snprintf(str, BUFFERSIZE, "\t<%s>[%s](%s) $ ", time, user, baseName);
    

    【讨论】:

    • sprintf 在字符串中“打印”,而不是在您的显示器中。
    • @wormsparty 你的意思是固定大小的数组?还是snprintf?导致第一个唯一的约束你。
    • 如果你在其他地方需要它,例如从函数中返回它:return strdup(str),然后释放它。
    • sprintf 在你的“存储”中打印一个字符数组,而不是你的 stdout(1)->输出屏幕
    【解决方案3】:

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

    你必须分配足够大的内存(然后是空闲的)来保存结果字符串:

    char *str = malloc( computeResultSizeSomehow() );
    if( str == 0 ) {
       // malloc failed - handle as fatal error
    }
    
    //proceed with your code, then
    
    free( str );
    

    【讨论】:

    • 什么是 computeResultSizeSomehow()?
    • 在尝试使用指针之前尝试阅读一些关于指针的内容。 boredzo.org/pointers
    • @kanoz:你必须评估你需要多少内存。这叫做伪代码。
    猜你喜欢
    • 2013-08-23
    • 2016-01-21
    • 2016-03-14
    • 2017-01-18
    • 2018-06-21
    • 1970-01-01
    • 2015-08-16
    • 2020-10-05
    • 2012-07-27
    相关资源
    最近更新 更多