C中的面试问题和讨论

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)