【问题标题】:Function to return a string in C. Why this return null? [duplicate]在 C 中返回字符串的函数。为什么返回 null? [复制]
【发布时间】:2019-05-04 19:23:11
【问题描述】:

如何返回一个字符串以供使用? 我不知道为什么这个功能不起作用。

#include <stdio.h>

char* test(){
   char A[100];
   scanf("%s", A);
   printf("A = %s \n", A);
   return(A);
}

main(){
    char* B;
    B = test();
    printf("B = %s \n", B);  // why this return (null)?
}

【问题讨论】:

  • 另外,请不要让return 看起来像一个函数。
  • 为什么我的程序具有未定义行为的可能重复?

标签: c string function


【解决方案1】:

这是未定义的行为。它可能会返回“正确”的值;它还不如做一些完全不同的事情,使程序崩溃,或者更糟。未定义行为的原因如下:

char* test(){
    char A[100];
    scanf("%s", A);
    printf("A = %s \n", A);
    return(A);
}

在这里,您在堆栈上声明了一个包含 100 个 char 的数组。稍后您将地址返回到该内存。但是,它在堆栈上,所以现在内存是无效的。然后将这个无效的内存指针分配给B

char* B;
B = test();

所以在这一行:

printf("B = %s \n", B);  // why this return (null)?

你有未定义的行为。

试试这个:

char* test() {
    char* A = malloc(100);
    scanf("%s", A);
    printf("A = %s \n", A);
    return A;
}

在这个函数中,内存是在堆上分配的。这样,您返回的指针是有效的(另请注意,您不需要在 return A; 中的 A 周围加上任何括号)。不过,不要忘记再次释放内存。您可以通过在程序结束时调用它来做到这一点:

free(B);

请注意,对于您的代码,您的编译器可能会发出警告。它可能会这样说:

局部变量或临时的返回地址:A

这些警告可以帮助您发现潜在问题并调试您的代码。当程序不工作时,请先尝试解决所有警告。

【讨论】:

  • 谢谢,工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
相关资源
最近更新 更多