后续的printf语句破坏了不相关的数组

时间:2013-09-25 03:32:34

标签: c arrays printf

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

3 个答案:

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

答案 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)

您正在返回当地的可用性

无论

  1. 使用malloc(就像您在C世界中printf
  2. 一样
  3. 传入要填充的指针