【问题标题】:How to fix Segmentation fault (core dumped) error in C如何修复 C 中的分段错误(核心转储)错误
【发布时间】:2020-03-27 17:12:40
【问题描述】:

我正在构建一个将十六进制转换为二进制的程序,我为此使用char,因为稍后在我的程序中我需要将二进制文件分成不同的部分。所以使用字符是我认为最简单的方法。

我是 C 的新手,所以请耐心等待。用户必须输入一个十六进制数字,然后将其传递给我的函数。我使用 if/else 来获取 char 数组中每个 char 的二进制文件。所以如果用户输入30,那么我想返回像“00110000”这样的字符数组,但是我得到了分段错误错误。

有谁知道为什么以及如何解决这个问题?另外我收到警告说传递参数 1 pf strcopy 使指针从整数而不进行强制转换?

char *hextobin(char *hex, int m);
int main(int argc, char **argv) {

  int m = 8;
  char *address;
  printf("Enter an hex: ");
  scanf("%s", address);

  address = hextobin(address, m);

  return 0;
}

/*convert hexadecimal to binary*/
char *hextobin(char *hex, int m) {
  char p[m - 1];
  int i = 0;
  while (hex[i] != '/0') {
    if (hex[i] == '0') {
      strcpy(p[i], "0000");
    } else if (hex[i] == '1') {
      strcpy(p[i], "0001");
    } else if (hex[i] == '2') {
      strcpy(p[i], "0010");
    } else if (hex[i] == '3') {
      strcpy(p[i], "0011");
    } else if (hex[i] == '4') {
      strcpy(p[i], "0100");
    } else if (hex[i] == '5') {
      strcpy(p[i], "0101");
    } else if (hex[i] == '6') {
      strcpy(p[i], "0110");
    } else if (hex[i] == '7') {
      strcpy(p[i], "0111");
    } else if (hex[i] == '8') {
      strcpy(p[i], "1000");
    } else if (hex[i] == '9') {
      strcpy(p[i], "1001");
    } else if (hex[i] == 'a') {
      strcpy(p[i], "1010");
    } else if (hex[i] == 'b') {
      strcpy(p[i], "1011");
    } else if (hex[i] == 'c') {
      strcpy(p[i], "1100");
    } else if (hex[i] == 'd') {
      strcpy(p[i], "1101");
    } else if (hex[i] == 'e') {
      strcpy(p[i], "1110");
    } else if (hex[i] == 'f') {
      strcpy(p[i], "1111");
    } else
      printf("Invalid Hex!!\n");

    i++;
  }
  return p;
}

【问题讨论】:

  • p[i] 的类型为 char。你想要一个指针。
  • 您忘记为字符串分配内存。在 main 中,address 是一个未定义的值。
  • p[i]i 位置的字符,您可以使用&p[i] 之类的东西,这是该字符的地址,但是对于每个输入的十六进制字符,您必须将索引移动到输出二进制字符 4。顺便说一句:else if 的系列更容易写成switch-case
  • 同样返回分配在堆栈上的p总是错误的。
  • 另外,在hextobin 中,您尝试返回局部变量的地址。你不能这样做,因为从函数返回时变量不再存在。

标签: c


【解决方案1】:

address是一个未初始化的指针,你必须让它指向一个有效的内存地址,该地址可以包含scanf传递给它的字符串。

您需要为其分配内存,或者将其声明为具有所需大小的 char 数组。

这可能是您出现分段错误的原因。但是,代码中还有其他问题,例如您正在返回指向将超出范围的局部变量的指针。

【讨论】:

  • 这只是问题之一。
  • @TomKarzes,你是对的,但很可能是导致分段错误的人。
  • 好的,谢谢这解决了这个问题,我仍在学习指针并试图了解它们是如何工作的。这一切仍然令人困惑
  • @Bobby.lock,很高兴你能解决它,学习指针是一个过程,一开始看起来很复杂,但后来变得微不足道,祝你好运。
  • 谢谢!确实是一个深入理解指针的过程
猜你喜欢
  • 1970-01-01
  • 2021-06-23
  • 2016-03-13
  • 2019-03-14
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多