C中的面试问题和讨论

时间:2011-07-09 16:26:43

标签: c global-variables

这是我在c:

的采访中向我提出的问题
#include<stdio.h>
void main(){
  char *ch;
  ch=fun1();
  printf(ch);
}

fun1(){
  char *arr[100];
  strcpy(arr,"name");
  return arr;
}

我得到了上述程序,并被要求弄清楚上述代码中的问题。 以下是我的回答

  • 功能声明是错误的 返回类型应为char **
  • printf的语法错误
  • arr范围仅限于函数fun1

然后

访问员 :您的解决方案是什么?

:您需要将arr变量设为全局并修复上述剩余问题。

访问员 :您认为全局变量是否危险?

:是的,因为我们无法说出在哪些函数中访问它的位置,有时几乎不可能找到哪个函数更改了值

Ineterviewer :给我一个没有全局变量的解决方案

的:????

你的解决方案是什么? 任何人都可以指出我所犯的错误!!

6 个答案:

答案 0 :(得分: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;
}

这就是我发现的关于代码片段的内容......

#include<stdio.h>

我会在标题前添加一个空格:#include <stdio.h>;但这只是为了看起来

void main()

错误! main会返回int始终!
如果您需要参数

,它应该是:int main(void)int main(int argc, char **argv)之一
{
char *ch;
ch=fun1();

范围内fun1没有原型。这使得编译器假定函数返回类型int的值,并且语句尝试将该值赋给类型为char*的对象,这是非法的:编译器必须在此处发出诊断。

printf(ch);
}

fun1()

在C99中,必须指定返回类型;在C89中,假设int。此函数定义也应该是原型(在C89和C99中)并指定参数的数量和类型(如果没有参数,则为void。)

{
char *arr[100];

为什么你需要一个包含100个指针的数组? ???

strcpy(arr,"name");

糟糕......范围内没有strcpy()的原型。另外,假设strcpy<string.h>中声明的char*,则第一个参数应该是char **而不是return arr;

arr
函数返回后,

} 不再存在。它的地址(数组在此上下文中衰减到其第一个元素的地址)在调用代码中不可用。

{{1}}

答案 1 :(得分:2)

函数内部static char arr[100](这会导致问题,因为它会使它不可重入)或者你应该malloc()数组并返回它的指针(你应该稍后在调用者中释放它)功能)。

不要等待该公司回电;)

答案 2 :(得分:1)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void fun1();

int main()
{
char *ch = malloc(sizeof(char) *100);
fun1(ch);
printf("%s\n", ch);
free(ch);
}

fun1 (char* ch)
{
    strcpy(ch,"name");
}

这是最好的解决方案imo。显然还有其他方法可以做到这一点。您可以声明char arr[100]并传入,然后设置ch = arr,但这基本上会切断中间人。

虽然我认为这会改变问题格式,所以我不确定是否允许这样做。如果您必须维护结构,那么函数中的static char arr[100]malloc()是可行的方法。

答案 3 :(得分:0)

我至少看到以下其他错误:

  1. 如果您遵循现代标准,main()的返回类型应为int
  2. 应使用puts()函数代替printf(),因为不会执行格式化。
  3. 变量arr可能应该有char*类型,而不是char**(单个字符串与100个字符串的数组。)
  4. fun1()在声明之前被调用&amp;定义,这是一个错误。在一个真实的项目中,你将在头文件中有一个前向声明,它伴随着你的程序代码。
  5. 该程序以当前形式什么都不做
  6. 首先,你应该问问你的面试官:“该计划应该做什么?”在你试图解决它之前,IMO。如果要将“name”输出到std输出,则以下代码就足够了,并且更简单(即更好):

    #include<stdio.h>
    int main() {
        puts("name");
        return 0;
    }
    

答案 4 :(得分:-1)

函数中的arr静态声明

static char arr[100];

这样它仍然是本地函数,你可以返回一个有效的指针。

btw,fun1的返回类型应为char*,而不是char**

答案 5 :(得分:-1)

因此函数fun1返回的字符串是固定的, func1可以返回const char*类型。 字符串"name"将存储在只读区域中 并且它的指针将被返回。

#include<stdio.h>
int main(){
  const char *ch;
  ch=fun1();
  printf("%s", ch);
  return 0;
}
const char *fun1(){
  const static char* arr[] = "name";
  return arr;
}

您可以写如下:

const char *fun1(){
  return "name";
}