【问题标题】:Why am I getting segmentation fault error? [closed]为什么我收到分段错误错误? [关闭]
【发布时间】:2021-09-11 20:48:53
【问题描述】:

我正在编写一个需要将数字从十进制转换为二进制的 C++ 程序。这是我的代码:

int* convertToBinary(int i, unsigned int n) {
    int ans[10000];
    if (n / 2 != 0) {
        convertToBinary(i + 1, n / 2);
    }
    ans[i] = n / 2;
    return ans;
}

void send_number(int num) {
    
    for (int j = 0; j < 16; j++) {
        printf("%d", convertToBinary(0, num)[j]);
    }   
}

在这种情况下,num 变量只取 0 到 65535 之间的自然值。

主要功能是send_number()

在执行时,我收到“分段错误(核心转储)”错误。我不知道为什么会这样。

PS:我是 C++ 初学者。我英语不太好,用谷歌翻译器

【问题讨论】:

标签: c++ segmentation-fault


【解决方案1】:

有 2 个问题在起作用 - 范围和(相关的)悬空指针。 当您在函数内部定义任何变量时 - 它仅在该函数内部有效。

convertToBinary 返回一个指向无效内存的指针。因此,当您尝试打印它时-您正在使用 convertToBinary(0, num)[j]

想想这是做什么的。您获取函数返回的无效指针并向其添加偏移量j

【讨论】:

  • 我想我理解你。但我还有几个问题。我可以从函数返回的不是指向内存的指针,而是值本身吗?或者也许可以返回一个在函数外有效的指针?
  • @MatveyPolubryukhov 你可以做这些事情中的任何一个。您甚至可以像您的代码一样返回一个指向不再存在的对象的指针,只要您不取消引用该指针。
  • @MatveyPolubryukhov - 这里有不同类型的内存 - 在函数内分配堆栈,使用 new/delete 和 malloc/free 分配堆。
  • 为了简单起见,在你理解内存分配之前,不要从函数返回指针,只返回一个值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多