0

在以下代码中,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;
}
4

3 回答 3

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;
}

Usingmalloc确保分配的内存在函数结束后将继续存在,并且您将不再导致未定义的行为。请注意,数组有些“特殊”;您可以返回原始值(intchar等)和结构,而不会发生这种行为。

于 2013-09-25T03:35:53.240 回答
0

您在函数中返回一个本地char dir[200]handle_input在函数退出后,访问它是未定义的行为。

请改用动态内存分配,例如:

char* handle_input(int argc,char *argv[]){
    char *dir = malloc(200);
    //do the processing
    return dir;
}

用完后要记住free

于 2013-09-25T03:36:15.757 回答
0

您正在返回一个本地变量

任何一个

  1. 使用malloc(就像你在 C 世界中一样printf
  2. 传入要填充的指针
于 2013-09-25T03:37:50.233 回答