问题描述
|
我通过以下方式使用strcmp
传递char []数组名称
将指针传递给字符串文字
但是,第二个结果是段错误。即使我已经确认指针指向正确的字符串文字,但我仍然困惑为什么会出现段错误。
这是代码:-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char const *args[])
{
char firstName[strlen(*++args)];
strcpy(firstName,*args);
char lastName[strlen(*++args)];
strcpy(lastName,*args);
printf(\"%s\\t%s\\n\",firstName,lastName);
printf(\"%d\\n\",strcmp(firstName,lastName));// this works
printf(\"%d\\n\",strcmp(*(--args),*(++args)));//this gives me a seg fault
return EXIT_SUCCESS;
}
我将其保存为str.c并在编译时首先收到以下警告:
[Neutron@Discovery examples]$ gcc -Wall str.c -o str
str.c: In function ‘main’:
str.c:15: warning: operation on ‘args’ may be undefined
最终运行它,出现段错误,如下所示
[Neutron@Discovery examples]$ ./str Jimmy Neutron
Jimmy Neutron
-4
Segmentation fault (core dumped)
解决方法
当您将相同的变量作为两个不同的参数两次传递给相同的函数时,请勿使用
--
和++
。
代替ѭ5
做
char *first = *(--args);
char *second = *(++args);
printf(\"%d\\n\",strcmp(first,second));
仍然不是很可读(最好使用索引并对照ѭ7进行有效性检查),但是至少您不要更改该值并在同一序列点对其进行多次评估。
, 除了littleadv \的帖子所说的以外,您的缓冲区太短了一个字符(它没有为空终止符留任何空间)。因此,您的“ 8”会导致缓冲区溢出。