字符串 - 分段错误

时间:2012-11-27 06:13:04

标签: c

我的代码有问题。我正在使用gcc编译器,当我编译并执行此代码时,我遇到了一个seg错误。我只是分配两个变量,name_1作为指针,name_2作为字符串。当我试图为这两个值提供字符串输入时,我得到一个seg错误。此seg错误始终与我正在使用的指针变量相关联。

下面我提供了错误的代码和屏幕截图。

#include <stdio.h>

int main()
{
char *name_1 ;
char name_2[10] ;

/*      Getting 2 strings as an input from the user
        and is stored in the pointer variable name_1 and name_2*/
scanf("%s",name_1) ;
scanf("%s",name_2) ;

/*      Printing the values of the varibales 
        name_1 and name_2 in string format      */
printf("\n%s",name_1) ;
printf("\n%s",name_2) ;

printf("\n\n") ;
return 0 ;
}

请在此代码中帮助我。

Seg fault

4 个答案:

答案 0 :(得分:3)

char *name_1;,是一个指针。最初,它指向一些随机垃圾。然后,您要求scanf将字符串放在任何随机垃圾地址name_1恰好指向您的程序启动时;这是未定义的行为。符合条件的C实现可以使该程序仅在周二才能按预期工作。 :)

如果你要传递一个指针,你必须先确保它指向一个有效的缓冲区。

此外,您对scanf的调用中存在间接违规级别 - name_1已经是指针。您不希望将指针传递给指向scanf的指针;只是一个指针。

答案 1 :(得分:2)

问题的原始版本包含:

char *name_1;
...
scanf("%s", &name_1);

此问题已修订为包含:

char *name_1;
...
scanf("%s", name_1);

您尚未为name_1指定任何空间。您还将char **(即&name_1)传递给scanf(),格式为%s,预计会获得char *

可能的解决方法:

int main(void)
{
    char name_1[20];
    char name_2[10];

    scanf("%s", name_1);
    scanf("%s", name_2);

另一种可能的解决办法:

int main(void)
{
    char name_0[20];
    char *name_1 = name_0;
    char name_2[20];

    scanf("%s", name_1);
    scanf("%s", name_2);

答案 2 :(得分:0)

char *name_1 ;
...
scanf("%s",&name_1) ;

name_1是一个悬空指针,你试图使用它,这是不正确的。

答案 3 :(得分:0)

指针char *name_1应该指向某个东西。 通常遵循

Declaring a pointer variable does not create the type of variable, 
it points at. It creates a pointer variable. So in case you are pointing 
to a string buffer you need to specify the character array and a buffer 
pointer and point to the address of the character array.

推荐的更改:

  • 您可以让char *name_1指向另一个字符数组或

  • 你可以把它作为数组......