-1

可能重复:
尝试在结构上使用 scanf 时出现分段错误

我是 C 编程新手,并且有以下代码。

char *s;
scanf("%s",s);
printf("This is s %s",s);

上面的代码行导致了分段错误。你能解释一下为什么吗?是否有一些文章可以让我阅读以更深入地理解这些概念?

4

4 回答 4

2

您可以写入该特定实体 拥有的内存地址。

例如:

char s[10];

编译器保留足够的内存来存储10字符s,您可以自由地对其进行写入。

当你说:

char *s;

指针s只是指向一些不属于它或为其保留的随机内存地址。写入该内存地址会导致写入某个其他实体拥有的内存。从技术上讲,这是未定义的行为
实际上,可能会发生或不发生段错误,具体取决于写入的内存地址是否属于某个其他实体。因此,您很幸运遇到了引起您注意的崩溃。无论如何,这是未定义的行为,因此应始终避免。

您需要为指针分配内存以便能够对它进行任何有意义的操作。无论是堆栈上的内存还是堆上的内存,但它应该是拥有的,因此可以写入。

于 2012-10-01T06:12:40.633 回答
1

使用 fgets 使用数组和指针尝试此操作:

static void get_input()
{
    /* Array of 32 btyes long - no input can be 32 characters in total */
#define CHAR_SIZE 32
    char str_array[CHAR_SIZE];
    char *str_ptr = calloc(sizeof(char), CHAR_SIZE);

    /* Get input from user - limit the input to 32 bytes using fgets which is safer */
    printf("Please enter something: ");
    /* Clear the memory before using it */
    memset(str_array, 0, CHAR_SIZE);
    fgets(str_array, CHAR_SIZE, stdin);
    printf("The input was [ %s ]\n", str_array);

    /* Doing the same thing with a pointer */
    printf("Please enter something again: ");
    fgets(str_ptr, CHAR_SIZE, stdin);
    printf("The input again was [ %s ]\n", str_ptr);

    /* free memory */
    free(str_ptr);
}

希望能帮助到你,

于 2012-10-01T06:50:08.780 回答
0

指针存储地址。并且该地址应该始终是某些保留内存的地址。

意思是做完之后char *s。您需要使用malloc或为其保留/分配一些内存calloc

char *s=malloc(10*sizeof(char));

假设 char 的大小为 1 个字节,这将分配 10 个字节的内存。请记住,free完成目的后,您需要使用免费功能分配的内存。

于 2012-10-01T06:18:51.780 回答
0

您已经创建了一个指针,但现在它未初始化(可能指向您无权访问的某个位置)。

char *s;

要么将其声明为数组

char s[20]; //this number should be big enough to hold the input

或者分配一些内存然后指向它。

char *s = (char *) malloc (20*sizeof(char));

参考:scanf

于 2012-10-01T06:34:35.060 回答