-4

我编写了以下程序:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

void inttobusn(int val, int n, char* bus)
{
    int i;
    unsigned int digit;

    for (i=0; i < n; i++) {
            digit = pow(2, (n-1-i));
            if (digit <= val) {
                    val -= digit;
                    bus[i] = '1';
                    //printf("hello %c",bus[i]);
            } else {
                    bus[i] = '0';
            }       
     }
} 
main(){
  char* bus;
  inttobusn(37,8,bus);
  int i=0;
  //printf("%s",bus);
  for(i=0;i<12;i++){
      printf("%c",bus[i]);
  }
}

但是在运行时它不会打印数组的元素bus。它不打印任何东西。我无法弄清楚出了什么问题。请问有人可以指出吗?

4

3 回答 3

6

你的代码有问题!您没有为bus[]数组分配内存,而是尝试访问垃圾位置的值,例如bus[i] = 0;——标准中的未定义行为C,未定义意味着您无法预测代码在运行时的行为方式。

编译此代码是因为在语法方面代码是正确的,但在运行时操作系统会检测到非法内存访问并可以终止您的代码。(有趣的是:当操作系统检测到进程违反内存权限时——对有效内存的无效访问会给出:SIGSEGV 并且对无效地址的访问会给出:SIGBUS)。在最坏的情况下,您的程序似乎执行时没有任何故障,产生垃圾结果。

为了简单地纠正它,将bus数组定义为使用void* malloc (size_t size)char bus[N];动态分配的内存;

此外,@Lochemage 和@Ran Eldan 给您的建议:

您需要声明具有特定大小的总线,例如char bus[12]. 它必须至少足够大以容纳12字符,因为最后你的 for 循环正在迭代那么多(你可以检查你的代码是否使用这个建议@codepade)。

您的代码中也没有返回类型main(),它应该是int main(void).

于 2013-07-25T17:36:38.080 回答
2

没有分配内存,bus所以这是一个未定义的行为。要么写

char bus[some sufficient size];

或使用malloc,realloc来保留内存。

于 2013-07-25T17:37:25.757 回答
0

您没有初始化总线变量。

char* bus = malloc(8 * sizeof(char));
于 2013-07-25T17:38:02.130 回答