将char分配给char-意外行为

时间:2019-01-14 09:08:21

标签: c pointers char variable-assignment

我希望在

之后
*b = a[0] 

行:

printf("%c\n", *b);

将打印字符串a中的第一个字符。这是我的短代码:

#include <stdio.h>

int main(){

    char a[20];
    char* b;

    scanf("%s", a);
    printf("a: %s\n", a);
    *b=a[0]; // I suppose something here is wrong
    printf("%c\n",*b);


    return 0;}

输入:

STRING

输出为:

a: STRING
Segmentation fault (core dumped)

据我所知,当我们尝试访问未分配的内存(静态或动态)时,会发生分段错误。 在这里,b是指向char的指针,因为我的OS是64位的,所以它占用8个字节。 我们使用* b取消引用指针,即访问其内容。 b具有char *类型,a [0]具有char类型,* b具有char类型。怎么了?

2 个答案:

答案 0 :(得分:2)

这里的问题是您没有为char分配任何b指向的位置,但是您尝试写到b指向的位置,这就是它崩溃的原因。

您可能想要类似的东西:

b = &a[0]

现在b包含a的第一个元素的地址,即&a[0](也恰好与您通过a获得的地址相同,方式)。

或者,如果您希望b指向它自己的char并像代码中那样复制第一个字符,则可以事先为其分配内存:

b = malloc(sizeof(char));   // after this, *b=a[0]; can be done

如果这样做,别忘了在完成后释放该内存:

free(b);

答案 1 :(得分:0)

  

*b=a[0];

您崩溃了,因为您在未初始化时取消引用 b

所以您写入一个未知的地址,并有机会使该地址无效并导致崩溃,最糟糕的是何时可以写入