【问题标题】:How can I trace a core dump in my C code?如何在我的 C 代码中跟踪核心转储?
【发布时间】:2020-10-17 08:38:03
【问题描述】:

我有一个核心转储,我不知道为什么。代码如下:

#include <stdio.h>

int str_size(char *str) {
    int size = 0;

    for (int i = 0 ; str[i] != '\0' ; i++) {
    size++;
    }
    return (size);
}

int find_char(char c, char *str) {
    int place = 0;
    for (int i = 0 ; str[i] != '\0' ; i++) {
        if (c == str[i]) {
            place = i;
        }
    }
    return (place);
}

char *convert_dec_to_base(int n, char *base) {
    char n_based[64];
    char converted_b[64];

    for (int i = 0 ; n != 0 ; i++) {
        n_based[i] = base[n % str_size(base)];
        n /= str_size(base);
    }
    for (int i = 0 ; i < str_size(n_based) ; i++) {
        converted_b[str_size(n_based) - i - 1] = n_based[i];
    }
    return (converted_b);
}
int main(void) {
    printf("%s\n", convert_dec_to_base(32, "0123456789ABCDEF"));
    printf("%c\n", t[1]);
    return (0);
}

此代码会将十进制整数转换为给定的基数。它将返回一个包含基本转换整数的char*

【问题讨论】:

  • convert_dec_to_base() 中,您返回本地数组converted_b(好吧,您返回指向其第一个元素的指针),但当main() 开始使用它时,该数组已不存在(该数组仅在函数激活时存在)。
  • 旁注: t 未声明
  • 看起来converted_b 不是以空值终止的
  • 旁注: 如果find_char 失败,则返回 0。这是字符串的有效索引(例如,如果str c,这也返回0)。如果找到not,则调整函数以返回(例如)-1。

标签: c runtime-error coredump char-pointer


【解决方案1】:

converted_b 是函数的局部变量,返回它会导致未定义的行为,您可以将其声明为指针并分配内存以便能够返回它:

#include <stdlib.h>
char* converted_b = malloc(64);

在这种情况下,程序将在那里结束,但在正常情况下,当您使用完它时,您应该释放之前分配的内存:

char* str = convert_dec_to_base(32, "0123456789ABCDEF");
printf("%s\n",str);
free(str);

作为替代方案,作为@CraigEstey mentioned in the comment section,您可以使用静态存储:

static char converted_b[64];

这将确保变量的生命周期与程序本身相同。

【讨论】:

  • 请注意,main 使用结果,而不是free 它,并产生内存泄漏。也许使用static 作为替代方案,或者更多关于使用free 的解释?
猜你喜欢
  • 2017-09-11
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多