【问题标题】:Binary to Decimal segmentation error二进制到十进制分段错误
【发布时间】:2016-04-15 15:03:18
【问题描述】:

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

#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();

}

【问题讨论】:

  • 只有指向动态分配的数据块开头的指针才需要被释放。你的指针指向不好。所以你不能把它传递给scanf
  • @juanchopanza 我怎样才能通过 scanf/ 是否有替代方法
  • 不要添加不同语言的标签。
  • @robinhood46 您需要弄清楚指针是什么(提示:名称中有线索)并且您需要阅读 scanf 的一些文档(特别是它对您的指针的假设传递给它。)
  • 您已经错过了指针需要指向某物的事实——它不是一个神奇的数组替换,它在需要时从精灵尘埃中召唤出存储。也不是所有的指针都需要被释放。我建议你给自己一个goodbook

标签: c pointers scanf


【解决方案1】:

在你的代码中

 scanf("%s",&input);

是有问题的部分。如我所见,有两个问题。

  • 首先,input 是指针,&amp;input 是指针的地址。
  • 其次,即使去掉&amp;,由于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

【讨论】:

  • 此外,在不指向动态分配内存的指针上调用free() 很可能会导致程序崩溃,因为它也是未定义的行为。
【解决方案2】:

因为你的指针是unitialized,所以undefined behaviour会出现,你的代码可能会也可能不会。

更多信息请参见this

【讨论】:

    【解决方案3】:

    我所要做的就是替换

       scanf("%s",&input);
    

       scanf("%ms",&input);
    

    感谢 BLUEPIXY

    【讨论】:

    • 不,这并不能解决您的程序中仍然存在的许多严重错误。未定义的行为很棘手:程序现在看起来可以运行,但下次运行时突然崩溃。您确实需要阅读并理解发布的其他答案。您至少有 3 个可能导致程序崩溃的严重错误。
    猜你喜欢
    • 2015-06-15
    • 2015-07-19
    • 2015-12-12
    • 2022-01-16
    • 2020-05-15
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多