【问题标题】:Segmentation fault on strlen(char*) but char* IS terminatedstrlen(char*) 上的分段错误,但 char* 已终止
【发布时间】:2013-01-05 10:53:20
【问题描述】:

我有一个非常简单的函数,它只是将一个 char 转换为一个 char*,它表示 char 的二进制值,其中 0 和 1 作为字符。

char* stringToBin(char symbol) {
    int pos = 0;
    int value = (int) symbol;
    int rest;

    char* result = (char*) malloc(sizeof(char) * 9);

    while(value > 0) {
            if(value % 2 == 0) {
                    result[7-pos] = '0';
            }
            else {
                    result[7-pos] = '1';
            }
            pos++;
            value = value / 2;
    }

    while(pos < 8) {
            result[7-pos] = '0';
            pos++;
    }

    result[8] = '\0';

    puts(result);
    puts(strlen(result));

    return result;
}

我的问题是我无法打印 char* 的长度。打印整个 char* 效果很好,但不计算大小。我总是遇到分段错误。我认为问题很简单,但我现在没有得到它。所以请给我缺少的提示;)

【问题讨论】:

  • 请构造一个完整的SSCCE test-case,包括导致问题的输入。
  • 标准提示:使用所有警告和调试信息进行编译(例如 Linux 上的 gcc -Wall -g)并使用调试器(例如 gdb
  • 价值可能是负数吗?
  • 两者都不是。 puts(strlen(result)); 是问题所在。

标签: c char segmentation-fault


【解决方案1】:

问题不在于字符串的 NUL 终止,这很好。相反,

puts(strlen(result));

错了。 puts() 需要一个 C 字符串,而你给它一个 size_t。改为写:

printf("%zu\n", strlen(result));

(假设size_t 的C99 格式说明符%zu 可用。如果不可用,则使用:

printf("%u\n", (unsigned)strlen(result));

相反。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-19
    • 2015-07-29
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2013-03-29
    • 2014-08-12
    • 2023-03-14
    相关资源
    最近更新 更多