Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数返回C中的字符串。为什么返回null?_C_String_Function - Fatal编程技术网

函数返回C中的字符串。为什么返回null?

函数返回C中的字符串。为什么返回null?,c,string,function,C,String,Function,如何返回字符串以便使用? 我不知道为什么这个功能不起作用 #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)? } #包括 ch

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

#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)?
}
#包括
char*test(){
chara[100];
scanf(“%s”,A);
printf(“A=%s\n”,A);
报税表(A);
}
main(){
char*B;
B=测试();
printf(“B=%s\n”,B);//为什么返回(null)?
}

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

char* test(){
    char A[100];
    scanf("%s", A);
    printf("A = %s \n", A);
    return(A);
}
这里,您在堆栈上声明了一个包含100个字符的数组。稍后,您将地址返回到该内存中。但是,它在堆栈上,因此内存现在无效。然后将此无效内存指针指定给
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;
}
在这个函数中,内存是在堆上分配的。这样,返回的指针是有效的(还请注意,
returna;
中的
A
周围不需要任何括号)。不过,别忘了再次释放内存。您可以在程序结束时调用以下命令:

free(B);
请注意,对于您的代码,编译器可能会发出警告。它可能会说:

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


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

此外,请不要使
return
看起来像一个函数。可能会重复为什么我的程序的未定义行为表现为这样?谢谢,工作正常。