我写了以下程序:
#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
的元素。它不打印任何东西。我无法弄清楚出了什么问题。有人可以指出吗?
答案 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];
或使用malloc
,realloc
来保留内存。
答案 2 :(得分:0)
您没有初始化总线变量。
char* bus = malloc(8 * sizeof(char));