【问题标题】:A char pointer function returns string inside the function but not in main?char 指针函数在函数内部返回字符串,但不在 main 中?
【发布时间】:2020-09-24 18:24:14
【问题描述】:

为什么stringParser中t的值打印的是“Hello”,而main函数中没有?

#include <stdio.h>

char* stringParser(char st[]) {
    char temp[100];
    int i = 0;
    while (st[i] != '\0') {
        temp[i] = st[i];
        i++;
    }
    temp[i] = '\0';
    char* t = temp;
    printf("%s", t);  
    return t;                // Outputs: "Hello"
}

int main() {
    char y[] = "Hello"; 
    printf("\n%s", stringParser(y));   //Outputs: "╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠⌠²Ö"
    return 0;
}

【问题讨论】:

  • @neostar 退出函数后返回的指针无效,因为自动存储时长函数的局部变量指向的数组不存在。
  • @Carcigenicate t 是一个指向字符串 temp 的指针,因此函数 stringParser() 应该返回该指针。 stringParser 的指针不应该保存字符串 temp 的值吗?
  • 看看here 然后here
  • @neostar 一旦函数调用结束,函数内的所有局部变量都将被销毁,这里变量 temp 被销毁,因此您的函数返回一个指向 temp 地址但 temp 的值已被销毁的指针
  • 可能与 Returning string from C function 重复?

标签: c pointers char


【解决方案1】:

数组temp只存在于函数stringParser()的范围内。指针t 指向数组temp 或者换句话说t 保存temp 的存储地址。当您从函数stringParser() 返回时,数组temp 不再存在并且访问它会导致未定义的行为(UB)。您返回指向temp 的指针t 并将其提供给printf()printf() 取消引用指针,意味着它想访问t 指向的数组,但数组temp 不再存在,因此你有UB。

有多种方法可以避免 UB:

  • 创建数组tempstatic。但这不适用于多线程程序,应在库中避免使用。
  • 使用动态内存分配,使用malloc()calloc()temp-array 保留存储空间,但是当您不再需要该内存后,您必须再次free()
  • main() 中声明数组并将指向它的指针传递给stringParser(),但要检查大小并确保永远不会出现缓冲区溢出。

题外话:size_t 是一种更好的数组索引类型,因为它保证足够大以容纳所有可能的索引并且size_t 是无符号的。您的程序很容易因将来的更改而导致缓冲区溢出。由于您没有记录给stringParser() 的字符串必须短于100 chars。您需要更好地记录这一点,检查字符串是否太长或动态创建数组以使给定字符串足够大。

【讨论】:

    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2020-04-08
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多