在以下代码中,char数组dir
的打印结果是乱码。
但是,如果我注释掉指定的printf
声明,则打印结果是可理解的。这里发生了什么?谢谢。唱代码块/ gcc。
#include <stdio.h>
#include <string.h>
char* handle_input(int argc,char *argv[]){
char dir[200];
printf("Number of arguments: %d\n",argc);
if(argc<2) {
printf("No argument specified\n");
strcpy(dir,"Default argument");
}
else{
printf("Command line directory was specified\n");
++argv;
strcpy(dir,argv[0]);
}
strcat(dir,"_CAT");
return dir;
}
int main(int argc, char *argv[]){
char* dir;
dir = handle_input(argc,argv);
printf("This one messes it up!\n");
printf("%s\n",dir);
printf("DONE\n");
return 0;
}
答案 0 :(得分:0)
在你的handle_input
函数中,你将返回一个本地数组,这是一个巨大的禁忌;函数结束后,该数组不再存在,返回的内容只是废话。这将在您的程序中稍后调用未定义的行为。 printf
调用恰好覆盖了以前属于该阵列的内存。没有printf
调用,那个内存恰好是完整的,这就是它可以理解的原因。
返回数组的正确方法如下:
char* handle_input(int argc,char *argv[]){
char* dir = malloc(200 * sizeof(char)); // sizeof unnecessary for char,
// but it's a good habit to have
printf("Number of arguments: %d\n",argc);
if(argc<2) {
printf("No argument specified\n");
strcpy(dir,"Default argument");
}
else{
printf("Command line directory was specified\n");
++argv;
strcpy(dir,argv[0]); // This is unsafe! use strncpy instead
}
strcat(dir,"_CAT");
return dir;
}
使用malloc
可确保在函数结束后分配的内存将继续存在,并且您将不再导致未定义的行为。请注意,数组有些“特殊”;您可以返回原始值(int
,char
等)和结构,而不会发生这种行为。
答案 1 :(得分:0)
您正在函数char dir[200]
中返回本地handle_input
,在函数退出后,访问它是未定义的行为。
使用动态内存分配,例如:
char* handle_input(int argc,char *argv[]){
char *dir = malloc(200);
//do the processing
return dir;
}
一旦它不再使用,请记住free
。
答案 2 :(得分:0)
您正在返回当地的可用性
无论
malloc
(就像您在C世界中printf
)