2012-10-12 23 views
0

我写了一个函数,将采取代表一个二进制数的char*,并添加一个该数字。我遇到了一个非常容易混淆的错误,那就是当函数调用函数(argv[1])时char*来自用户输入时,函数可以正常工作,但当我在内部初始化变量并将其传递给Bus error: 10时相同的功能。我不确定这背后是什么,所以我转向你们。这里是我的代码:从命令行参数输入工作,但从内部char *输入给出总线错误。它不应该是相同的吗?

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

void addOneBinaryMain(char* strBiNum, int index) 
{ 
    if (strBiNum[index] == '0' || index == 0) { //BUS ERROR OCCURS HERE 
     strBiNum[index] = '1'; 
     return; 
    } else { 
     strBiNum[index] = '0'; 
     addOneBinaryMain(strBiNum, index - 1); 
    } 
} 

void addOneBinary(char* strBiNum) 
{ 
    addOneBinaryMain(strBiNum, strlen(strBiNum)-1); 
} 

int main(int argc, char* argv[]) { 
    char* str = argv[1]; 
    char* strZero = "00000000"; 
    int i; 

    printf("%s\n", str); 
    printf("%s\n", strZero); 

    addOneBinary(str); 
    printf("added one to input string: %s\n", str); //succeeds 
    addOneBinary(strZero); 
    printf("added one to internal zero string: %s\n", strZero); 

    return 0; 
} 

周围print语句错误之后,它似乎发生在addOneBinaryMain功能(递归步),在我的标记点。在一个常量字符串

+1

这么多重复... –

回答

1

strZero点,即不能改变

+0

即使我没有输入'const char *'?那么解决这个问题的唯一方法是用'malloc()'初始化它并迭代地分配每个值?看起来像一个PITA,但我想如果它是唯一的方式... –

+1

是的,这个数组可以分配在一个常量部分的进程中,所以任何尝试改变它都被系统拒绝。尝试char strZero [] =“0000”而不是 – mikithskegg

+0

非常感谢;还是一个新手哈哈。 –

1

strZero只是你的文字串“000000”的地址初始化一个点。这个字符串存储在只读的应用程序的RAM中(如果我没记错的话,认为它被称为静态存储)。

尝试在堆栈或堆上声明char数组,然后使用strcpy将strZero复制到它。

+0

谢谢!每天学习新东西... –

+1

欢迎您, 顺便说一句,我认为在您的代码中有一个错误,当二进制数字溢出(尝试将1添加到111以获得000)时,您将得到100。 – Algebra

+0

谢谢!你是对的。修复。 –