我正在尝试将字符串转换为大写,例如将test.pdf转换为TEST.PDF。但是,当我尝试使用printf打印返回的值时,它将打印一些垃圾值。我究竟做错了什么?

char *covertToUpper(char *str)
{
    int i = 0;
    int len = 0;

    len = strlen(str);
    char newstr[len+1];

    for(i = 0; str[i]; i++)
    {
       newstr[i] = toupper(str[i]);
    }
    //terminate string
    newstr[i]= '\0';
    return  newstr;
}

最佳答案

收到垃圾邮件的原因是因为您在堆栈上分配了newstr,然后返回其值。这在C语言中是一个很大的禁忌。您随后调用的每个函数(包括printf()函数本身)都会践踏所有内容您刚刚分配。

不幸的是,C语言有点危险。它不会阻止您将在堆栈上分配的字符串返回给调用函数,即使一旦在函数中声明了该函数,该内存就不再可以安全使用。

与其以这种方式分配字符串,不如使用malloc()calloc()在堆上分配新的内存,并设置newstr指向它。例如,您可以声明:

char newstr = malloc(len);

当然,当不再使用它时,需要适当地使用free() d。

关于c - 为什么从函数返回的字符串打印为垃圾?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9441132/

10-12 19:11