【问题标题】:C program randomly inserting random name of function into my arrayC程序随机将函数的随机名称插入我的数组
【发布时间】:2018-09-26 21:26:56
【问题描述】:

我有以下将十进制转换为二进制的程序:

#include <stdio.h>
#include <string.h>

int main() {
    printf("Number (decimal): ");
    int no;
    scanf("%d", &no);

    char bin[64];
    while (no > 0) {
        for (int i = strlen(bin); i > 0; i--) {
            bin[i] = bin[i - 1];
        }

        int bit = no % 2;
        char digit = bit + '0';
        bin[0] = digit;

        no /= 2;
    }

    printf("%s", bin);

    return 0;
}

程序正常运行,但随机字符串“ttime__vdso_get”被附加到末尾。

每次编译时实现它的数字都不同。

1:1

2:01ttime_vsdo_get

3:10ttime_vsdo_get

当数字变大时,情况会有所不同:

100039:11000011011000111ttime__vdso_getm@

10000000000000000000000000000:ttime


发生了什么?

如果我必须诊断它,我会说我已经设法制作了一个从错误位置提取内存的编译程序。不过,我不知道我是怎么做到的。

如果重要的话,我正在使用 GCC。

【问题讨论】:

  • strlen 不返回 int。
  • bin 未初始化。在其上调用strlen 的效果是不确定的。
  • @Michi 这不是问题,我已经通过其他方式获得了长度,但它仍在发生。
  • char bin[64]="";初始化bin,因为字符串的所有64个字符在程序中都没有改变,最初存储的垃圾值不会改变。因此出现在输出中
  • @JackHasaKeyboard 将从strlen() 返回的值(这是一个size_t 值)存储在int 中是一个问题,因为它是不好的编码习惯并且应该在编译时生成警告.注意编译器警告。

标签: c arrays gcc memory


【解决方案1】:

只要char bin[64] = "";,永远不要忘记一个有效的字符串是空终止的M@��M@。

strlen() 返回一个size_t

我还可以建议您使用char bin[sizeof no * CHAR_BIT + 1] = "";,它将为您的字符串使用正确的最大大小。

【讨论】:

    【解决方案2】:

    尝试填充变量 炭盒[64] 与 0

    【讨论】:

      【解决方案3】:

      可能是因为这行代码:

      for (int i = strlen(bin); i > 0; i--) {
              bin[i] = bin[i - 1];
          }
      

      尝试将strlen(bin) 替换为63

      用 0 初始化数组 bin 也是一个好主意。

      【讨论】:

        猜你喜欢
        • 2019-03-23
        • 2012-08-21
        • 2015-02-11
        • 1970-01-01
        • 2014-04-27
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 2015-09-10
        相关资源
        最近更新 更多