gpt4 book ai didi

c - 随后的 printf 语句破坏了不相关的数组

转载 作者:行者123 更新时间:2023-11-30 17:47:15 25 4
gpt4 key购买 nike

在下面的代码中,字符数组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;
}

最佳答案

在您的 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 等)和结构,而不会发生此类行为。

关于c - 随后的 printf 语句破坏了不相关的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18995739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com