这是我在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 :给我一个没有全局变量的解决方案
的我 的:????
你的解决方案是什么? 任何人都可以指出我所犯的错误!!
答案 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)
我至少看到以下其他错误:
main()
的返回类型应为int
。puts()
函数代替printf()
,因为不会执行格式化。arr
可能应该有char*
类型,而不是char**
(单个字符串与100个字符串的数组。)fun1()
在声明之前被调用&amp;定义,这是一个错误。在一个真实的项目中,你将在头文件中有一个前向声明,它伴随着你的程序代码。首先,你应该问问你的面试官:“该计划应该做什么?”在你试图解决它之前,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";
}