【问题标题】:Segmentation fault (core dumped) when assigning char to char pointer将 char 分配给 char 指针时出现分段错误(核心转储)
【发布时间】:2014-09-28 14:27:50
【问题描述】:

这个应该很简单.. 我在 C 中有以下代码:

#include <stdio.h>
#include <string.h>
main()
{
    printf("Got to 1\n");
    char *str;
    *str='a';
    printf("*str contains: %c",*str);
}

在看到 Segmentation Fault (core dumped) 错误之前,我没有打印出“Got to 1”行。 谁能解释这个错误背后的原因?

【问题讨论】:

  • 指针没有指向任何东西,所以你正在为内存中的一个随机位置分配一个值。
  • 它肯定会在屏幕上打印“Got to 1”。
  • @ani 可能会也可能不会。输出被缓冲,崩溃可能会阻止缓冲区被正确刷新。
  • @Ani,如果任何部分是未定义的行为,则所有赌注都将关闭。未定义的行为包括time travel。还有optimizations.
  • OP 使用的是\n,所以它肯定会在屏幕上打印“Got to 1”。

标签: c pointers


【解决方案1】:

你必须分配内存来存储一个字符。代码看起来像

char *str = malloc( sizeof( char ) );
*str='a';
printf("*str contains: %c\n",*str);
free( str );

或者你可以写

char c;
char *str = &c;
*str='a';
printf("*str contains: %c\n",*str);

也不需要包含标题&lt;string.h&gt;,因为您的程序中没有使用标题中的声明。

【讨论】:

    【解决方案2】:

    char *str; 只需将str 声明为指向char 的指针。它不分配内存。在将'a' 分配给*str 之前,您需要为str 分配内存。

    切勿将间接运算符应用于未初始化的指针。这样做,调用未定义的行为

    请注意,在这里为*str 赋值是危险的,因为它是未初始化的。如果它指向一个有效的内存地址,那么

    *str = 'a';
    

    将尝试修改存储在该位置的数据。
    如果此分配修改的位置属于程序,则它的行为可能不正常。如果它属于操作系统,那么程序很可能会崩溃

    【讨论】:

      【解决方案3】:

      文件流标准输出被缓冲,并没有立即写入显示器。

      【讨论】:

        【解决方案4】:

        首先为char *str分配内存,然后赋值。

            char *str=(char*)malloc(sizeof(char));
            *str='a';
            printf("*str contains: %c\n",*str);
            free( str );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-13
          • 2021-05-04
          • 2015-05-12
          • 1970-01-01
          • 1970-01-01
          • 2015-02-04
          • 2016-01-11
          相关资源
          最近更新 更多