C程序不打印

时间:2013-07-25 17:34:37

标签: c function

我写了以下程序:

#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的元素。它不打印任何东西。我无法弄清楚出了什么问题。有人可以指出吗?

3 个答案:

答案 0 :(得分:6)

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

编译此代码是因为语法方面的代码是正确的,但在运行时,操作系统将检测非法的内存访问并终止您的代码。 (有趣的是:由于OS检测到进程的内存权限违规 - 对有效内存的无效访问给出:SIGSEGV并且访问无效地址给出:SIGBUS)。在最糟糕的情况下,您的程序可能看起来没有任何失败,从而产生垃圾结果。

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

此外,来自@Lochemage和@Ran Eldan的建议:

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

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

答案 1 :(得分:2)

没有为bus分配内存,因此这是未定义的行为。写下

char bus[some sufficient size];

或使用mallocrealloc来保留内存。

答案 2 :(得分:0)

您没有初始化总线变量。

char* bus = malloc(8 * sizeof(char));