我有两个c程序“main.c”和“ArgHandle.c”。
的main.c
#include <stdio.h>
#include <stdlib.h>
main ( int argc, char * argv[] ){
char * a[4];
save_arg( argc, argv );
a[0]=get_arg(); //warning: assignment makes pointer from integer without a cast
if ( a[0] != NULL )
printf("a[0]=%s\n", a[0] );
}
ArgHandle.c
#include <stdio.h>
#include <stdlib.h>
static char * arg[5];
void save_arg( int argc, char * argv[] ){
int i;
for ( i=1; i<argc; i++ ){
arg[i-1]=argv[i];
printf("save_arg: arg[%d]=%s\n", (i-1), arg[i-1]);
}
}
char * get_arg(){
printf("get_arg: arg[0]=%s\n", arg[0] );
return (arg[0]);
}
当我执行程序“./main -abc”时,它返回
save_arg: arg[0]=-abc
get_arg: arg[0]=-abc
Segmentation fault (core dumped)
从函数get_arg()返回后,它可以打印出ArgHandle.c中的char *参数,但不能打印在main.c中。
我是c编程的新手,不知道为什么会这样。然后我找到Iharob Al Asimi's post,并认为我应该使用malloc()
为参数保留非本地内存。所以我修改了这样的代码:
main.c(修订版)
#include <stdio.h>
#include <stdlib.h>
main ( int argc, char * argv[] ){
char * a[4];
save_arg( argc, argv );
a[0]=malloc(50); // <~~~~ new added
a[0]=get_arg(); //warning: assignment makes pointer from integer without a cast
if ( a[0] != NULL )
printf("a[0]=%s\n", a[0] );
free(a[0]); // <~~~~ new added
}
ArgHandle.c(修订版)
#include <stdio.h>
#include <stdlib.h>
static char * arg[5];
void save_arg( int argc, char * argv[] ){
int i;
for ( i=1; i<argc; i++ ){
arg[i-1]=malloc(50); // <~~~~ new added
arg[i-1]=argv[i];
printf("save_arg: arg[%d]=%s\n", (i-1), arg[i-1]);
}
}
char * get_arg(){
printf("get_arg: arg[0]=%s\n", arg[0] );
return (arg[0]);
}
但是,没有区别,Segmentation故障仍然存在。
解决
感谢chux,Retired Ninja和LưuVĩnhPhúc提出的建议。通过添加声明标题解决了问题。