C strlen错误的答案

时间:2014-05-16 14:40:08

标签: c char strlen

我无法弄清楚我的代码有什么问题

char* readString() {

    char* result;
    char line[SIZE];

    if(! fgets(line, sizeof(line), stdin))
        fprintf(stderr, "error\n");

    //printf 1
    printf("line length = %lu\n", strlen(line));

    result = line;

    return result;
}

int main() {

    char* myWord = readString();
    unsigned long len = (unsigned)strlen(myWord);

    //printf 2
    printf("myWord length = %lu\n", len);

    return 0;
} 

如果printf1和printf2都被取消注释,那么我得到真正的长度。比如说'你好''我有输出

line length = 6
myWord length = 6

但如果我只评论printf1,那么同一个词'你好'我有

myWord length = 16

2 个答案:

答案 0 :(得分:8)

您的代码展示未定义的行为。您正在返回指向堆栈上声明的变量的指针。在这种情况下,lineresult

两种可能的修复方法包括:

  1. char line[SIZE];变量传递给readString()函数。
  2. 使用line在堆上为malloc()分配内存。

答案 1 :(得分:1)

返回由return删除的动态值(已分配堆栈)。你应该

  • 使用静态字符串,但它不支持多线程,也不支持递归
  • 让调用者将字符串定义为

    char * readstring(char * line, size_t size) {
    // Your stuff
        char * result = fgets(line, size);
    // ...
        return result;
    }