Vij*_*jay 3 c global-variables
这是在c的采访中向我提出的问题:
#include<stdio.h>
void main(){
char *ch;
ch=fun1();
printf(ch);
}
fun1(){
char *arr[100];
strcpy(arr,"name");
return arr;
}
Run Code Online (Sandbox Code Playgroud)
我得到了上述程序,并被要求弄清楚上述代码中的问题.下面是我的答案
char **printf错了arr 范围仅限于该功能 fun1然后
采访者:你的解决方案是什么?
我:你需要将arr变量作为全局变量并修复上面提到的其余问题.
采访者:你不觉得全球变量是危险的吗?
我:是的,因为我们不知道在哪些函数中访问它的位置,有时几乎不可能找到哪个函数改变了值
Ineterviewer:给我一个没有全局变量的解决方案
我:????
你的解决方案是什么?任何人都可以指出我所犯的错误!
pmg*_*pmg 13
我的解决方案可能是
#include <stdio.h>
#include <string.h>
/* copies "name" to `dst`.
** The caller is responsible for making sure
** `dst` has enough space */
char *fun1(char *dst) {
strcpy(dst, "name");
return dst;
}
int main(void) {
char ch[5];
printf("%s\n", fun1(ch));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这就是我发现的关于片段的内容......
#include<stdio.h>
Run Code Online (Sandbox Code Playgroud)
我会在标题前添加一个空格:#include <stdio.h>; 但这只是为了看起来
void main()
Run Code Online (Sandbox Code Playgroud)
错误!main返回一个int.总是!
它应该是以下之一:int main(void)或者int main(int argc, char **argv)如果您需要参数
{
char *ch;
ch=fun1();
Run Code Online (Sandbox Code Playgroud)
fun1范围内没有原型.这使得编译器假定函数返回type的值,int并且语句尝试将该值赋给char*非法类型的对象:编译器必须在此处发出诊断.
printf(ch);
}
fun1()
Run Code Online (Sandbox Code Playgroud)
在C99中,必须指定返回类型; 在C89中,int假设.此函数定义也应该是原型(在C89和C99中)并指定参数的数量和类型(或者void如果它不需要).
{
char *arr[100];
Run Code Online (Sandbox Code Playgroud)
为什么你需要一个100指针的数组????
strcpy(arr,"name");
Run Code Online (Sandbox Code Playgroud)
糟糕...... strcpy()范围内没有原型.另外,假设strcpy是声明的<string.h>那个,第一个参数应该char*不是achar **
return arr;
Run Code Online (Sandbox Code Playgroud)
arr函数返回后立即停止存在.它的地址(数组在此上下文中衰减到其第一个元素的地址)在调用代码中不可用.
}
Run Code Online (Sandbox Code Playgroud)