我在使用C语言中的引用将字符串数组传递给函数时遇到了问题。
上下文:我正在尝试使用一些命令创建一个非常简单的shell。当在命令的每个参数中键入命令时,将命令保存在字符串数组的插槽中。用于解析命令的函数叫做lineParsing(我没有这个来源 - 我只有.o和.h)
有问题的功能有以下标题:
void lineParsing (char **, int, char **, char **, char **, int *);
void lineParsing (char **item, int nargs, char **inputRedir, char **outputRedir, char **errorRedir, int *background);
该功能的描述如下: 指定参数数组(第一个参数)是否包含重定向或后台执行。
输入: 1 - 参数数组 2个参数 引用: 3 - 一个字符串数组,用于放置文件名以进行输入重定向 4 - 一个字符串数组,用于放置文件名以进行输出重定向 5-一个字符串数组,用于放置文件名以进行错误重定向 6-如果&如果不是0,则使用
我在临时主程序中调用此函数,如下所示:
int main (int argc, char *argv[]){
char **parrayArgumentos=NULL;
int i,numargs,background;
char *inputRedir[4]={"","","",""};
char *outputRedir[4]={"","","",""};
char *errorRedir[4]={"","","",""};
parrayArgumentos = lineInput (&numargs); //Asks for command via standard input.
printf ("You have typed in: %d arguments \n",numargs); //displays number of arguments
i=0;
while(i<=numargs-1){
printf ("%s \n",parrayArgumentos[i]);
i++;
}
lineParsing(parrayArgumentos,numargs,inputRedir,outputRedir,errorRedir,&background);
//This call is problematic
printf ("The command you have introduced has:\n%c for input redirection\n%c for output Redirection\n%s For error Ridirection\n%d background\n",inputRedir[0],outputRedir[0],errorRedir[0],background);
freeLineInput(parrayArgumentos);
return 0;
}
通过我创建的makefile编译没有错误或警告:
mishell: mishell.o parser64.o
gcc mishell.o parser64.o -o mishell
mishell.o: mishell.c
clean:
rm -f mishell.o mishell
当我执行二进制文件时,我在调用lineParsing的时候出现以下错误:
[xxxx@xxxx src]$ ./mishell
ls -la > listoffiles
You have typed in: 4 arguments
ls
-la
>
listoffiles
*** glibc detected *** ./mishell: free(): invalid pointer: 0x0000000000401078 ***
======= Backtrace: =========
/lib/libc.so.6(+0x784a6)[0x7f8a5f76b4a6]
./mishell[0x400d99]
./mishell[0x4007b6]
/lib/libc.so.6(__libc_start_main+0xf5)[0x7f8a5f714725]
./mishell[0x4005e9]
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:04 7865560 /home/xxxxx/Desktop/xxxx/xxxx/xxxxx/src/mishell
00601000-00602000 rw-p 00001000 08:04 7865560 /home/xxxxx/Desktop/xxxxx/xxxxx/xxxxx/src/mishell
00e25000-00e46000 rw-p 00000000 00:00 0 [heap]
7f8a5f4de000-7f8a5f4f3000 r-xp 00000000 08:03 1185891 /usr/lib/libgcc_s.so.1
7f8a5f4f3000-7f8a5f6f2000 ---p 00015000 08:03 1185891 /usr/lib/libgcc_s.so.1
7f8a5f6f2000-7f8a5f6f3000 rw-p 00014000 08:03 1185891 /usr/lib/libgcc_s.so.1
7f8a5f6f3000-7f8a5f88e000 r-xp 00000000 08:03 2490393 /lib/libc-2.16.so
7f8a5f88e000-7f8a5fa8d000 ---p 0019b000 08:03 2490393 /lib/libc-2.16.so
7f8a5fa8d000-7f8a5fa91000 r--p 0019a000 08:03 2490393 /lib/libc-2.16.so
7f8a5fa91000-7f8a5fa93000 rw-p 0019e000 08:03 2490393 /lib/libc-2.16.so
7f8a5fa93000-7f8a5fa97000 rw-p 00000000 00:00 0
7f8a5fa97000-7f8a5fab8000 r-xp 00000000 08:03 2490410 /lib/ld-2.16.so
7f8a5fc8a000-7f8a5fc8d000 rw-p 00000000 00:00 0
7f8a5fcb4000-7f8a5fcb8000 rw-p 00000000 00:00 0
7f8a5fcb8000-7f8a5fcb9000 r--p 00021000 08:03 2490410 /lib/ld-2.16.so
7f8a5fcb9000-7f8a5fcba000 rw-p 00022000 08:03 2490410 /lib/ld-2.16.so
7f8a5fcba000-7f8a5fcbb000 rw-p 00000000 00:00 0
7fff8533d000-7fff8535e000 rw-p 00000000 00:00 0 [stack]
7fff853ff000-7fff85400000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted
我在ArchLinux 3.4.4-2-ARCH x86_64下使用gcc 4.7.1
有谁知道为什么会这样?
非常感谢您提前提供所有帮助
答案 0 :(得分:0)
可能的原因是尝试释放inputRedir
,outputRedir
或errorRedir
中的任何元素,如果不变。当它们被初始化为字符串文字(空字符串)时,将其传递给free()
是非法的:
如果ptr是空指针,则不执行任何操作。否则,如果 参数与之前由calloc,malloc或realloc函数返回的指针不匹配,或者如果通过调用free或realloc释放了空间, 行为未定义。
一个推测性的修复方法是将元素初始化为NULL指针(将{NULL指针传递给free()
是安全的)这三个数组:
char *inputRedir[4] = { NULL, NULL, NULL, NULL };
char *outputRedir[4] = { NULL }; /* Unspecifed initializers will */
char *errorRedir[4] = { NULL }; /* be NULL by default. */
请注意,printf()
语句中的格式说明符不正确,因为inputRedir[0]
(outputRedir[0]
)是char*
,但提供的格式说明符为%c
,适用于char
类型:%s
使用char*
。