【问题标题】:Assignment char to char - unexpected behaviour [duplicate]将char分配给char - 意外行为[重复]
【发布时间】:2019-06-08 06:13:16
【问题描述】:

我预计之后

*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 的指针,它需要 8 个字节,因为我的操作系统是 64 位的。 使用 *b 我们取消引用指针,即访问它的内容。 b 具有 char* 类型,a[0] 具有 char 类型,*b 具有 char 类型。怎么了?

【问题讨论】:

  • 当然,指针本身是64位的,但它指向哪里呢?谁分配了这些内容?
  • @Angew 你是说即使我为指针分配了空间(通过 char* b),我也必须为 b 指向的变量分配空间?就像我们调用 malloc 为维度为 n 的数组分配空间一样,我应该以某种方式为这个单个字符分配空间?
  • 没错。好吧,你可以让它指向已经存在的东西,但是你的*b=a[0]; 行说“取a 的第一个元素并复制到b 指向的地方”。为此,它必须已经指向某个有效的地方。

标签: c pointers char variable-assignment


【解决方案1】:

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

你可能想要这样的东西:

b = &a[0]

现在b 包含a 的第一个元素的地址,即&amp;a[0](顺便说一下,这也恰好是您使用a 获得的相同地址)。

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

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

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

free(b);

【讨论】:

  • 顺便说一下,恰好是a”不正确或不精确:编译器decays数组的名称a 指向一个指针,“顺便说一下,这也恰好是 a[0] 的地址”
  • 感谢指正,我编辑了答案。
【解决方案2】:

*b=a[0];

你有一个崩溃,因为你取消引用 b 而它没有被初始化

所以你写了一个未知的地址,碰巧这个地址是无效的并产生了崩溃,最糟糕的是当写是可能的时候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2012-12-10
    相关资源
    最近更新 更多