二进制到十进制分段错误

时间:2016-01-11 10:31:41

标签: c pointers scanf

我使用指针代替数组,我知道需要释放指针而不像数组。为什么使用指针代替数组会给我一个分段内存错误。

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

void bin(void){

char *input;
int choice;
int x = 0;


    printf("Enter Decimal Code:\n");
    scanf("%s",&input);

    int leng = strlen(input);



    for(int i = 0; i <= leng ; ++i){

        if(input[i] == '1'){
            x += pow(2,i);


        }
        else if(input[i] == '0'){
            input[i] = 0;


        }
        free(input);

    }
        printf("Binary-Dec: %d\n",x);


}

int main()
{
bin();

}

3 个答案:

答案 0 :(得分:4)

在您的代码中

 scanf("%s",&input);

是有问题的部分。我可以看到,有两个问题。

  • 首先,input是指针,&input是指针的地址。
  • 其次,即使您删除了&,因为input没有分配内存,它仍然会导致undefined behavior

你应该做

 char input[32] = {0};
 scanf("%31s", input);   //limit the input buffer to prevent overflow

此外,建议您检查scanf()的返回值是否成功,以确保输入正确。

FWIW,声明

  

[...]我知道需要释放指针[..]

是的,但只有在通过malloc()或函数系列动态分配内存时才会这样。考虑以下情况,

char buf[32] = {0};
char *input = buf;
. . . . 

在这种情况下,您无需以任何方式输入free(),因为内存未动态分配。有关详细信息,请参阅this answer

答案 1 :(得分:1)

由于您的指针为unitialized,因此会出现undefined behaviour并且您的代码可能有效或无效。

有关详细信息,请参阅this

答案 2 :(得分:-1)

我所要做的就是替换

   scanf("%s",&input);

   scanf("%ms",&input);

感谢BLUEPIXY