简体   繁体   English

*** 检测到堆栈粉碎 ***:已终止

[英]*** stack smashing detected ***: terminated


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

void get_nbits(int num, int n);
void replace_nbits(int num, int n, int val);
void get_nbits_from_pos(int num, int n, int pos);
void replace_nbits_from_pos(int num, int n, int pos, int val);
void toggle_bits_from_pos(int num, int n, int pos);
void print_bits(unsigned int num, int n);

int main()
{
    printf("\tThis program is to show the below mentioned bitwise functions\n\n");
    printf("Select bit operation from below list:\n1. get_nbits\n2. set_nbits\n3. get_nbits_from_pos\n");
    printf("4. set_nbits_from_pos\n5. toggle_bits_from_pos\n6. print_bits\n");
    printf("Enter your choice: ");
    int choice,num,n,pos,val;
    scanf("%d",&choice);
    switch(choice)
    {
        case 1:
            printf("Enter number: ");
            scanf("%d",&num);
            printf("Enter n: ");
            scanf("%d",&n);
            get_nbits(num,n);
            printf("\n");
            break;
        case 2:
            printf("Enter number: ");
            scanf("%d",&num);
            printf("Enter n: ");
            scanf("%d",&n);
            printf("Enter val: ");
            scanf("%d",&val);
            replace_nbits(num,n,val);
            printf("\n");
            break;
        case 3:
            printf("Enter number: ");
            scanf("%d",&num);
            printf("Enter n: ");
            scanf("%d",&n);
            printf("Enter pos: ");
            scanf("%d",&pos);
            get_nbits_from_pos(num,n,pos);
            printf("\n");
            break;
        case 4:
            printf("Enter number: ");
            scanf("%d",&num);
            printf("Enter n: ");
            scanf("%d",&n);
            printf("Enter val: ");
            scanf("%d",&val);
            printf("Enter pos: ");
            scanf("%d",&pos);
            replace_nbits_from_pos(num,n,pos,val);
            printf("\n");
            break;
        case 5:
            printf("Enter number: ");
            scanf("%d",&num);
            printf("Enter n: ");
            scanf("%d",&n);
            printf("Enter pos: ");
            scanf("%d",&pos);
            toggle_bits_from_pos(num,n,pos);
            printf("\n");
            break;
        case 6:
            printf("Enter number: ");
            scanf("%d",&num);
            printf("Enter n: ");
            scanf("%d",&n);
            print_bits(num,n);
            printf("\n");
            break;
    }
}

void get_nbits(int num, int n)
{
    int bin_num[9];
    int cnt = 0;
    int bin_dig = 0;
    int multiple = 1;
    int decimal_num = 0, base = 1, rem; 
    while (num > 0) {
        bin_num[cnt] = num % 2;
        num = num / 2;
        cnt++;
    }
    for(int i=0;i<8;i++)
    {
        bin_num[i+cnt] = 0;
    }
   printf("The binary form of given number: ");
    for(int i=7;i>=0;i--) 
    {
         printf("%d ",bin_num[i]);
    }
    for(int i=0;i<n;i++) 
    {
         bin_dig = bin_dig + multiple*bin_num[i];
         multiple*=10;
    }
    while ( bin_dig > 0)  
    {  
        rem = bin_dig % 10;   
        decimal_num = decimal_num + rem * base;  
        bin_dig = bin_dig / 10;   
        base = base * 2;  
    } 
    printf("\nThe decimal number is: %d\n",decimal_num);
}

void replace_nbits(int num, int n, int val)
{
    int bin_num1[9],bin_num2[9];
    int cnt1 = 0,cnt2 = 0;
    int bin_dig = 0,bin_dig2 = 0;
    int multiple = 1;
    int decimal_num = 0, base = 1, rem;
    while (num > 0) {
        bin_num1[cnt1] = num % 2;
        num = num / 2;
        cnt1++;
    }
    for(int i=0;i<8;i++)
    {
        bin_num1[i+cnt1] = 0;
    }
   printf("\nThe binary form of given number: ");
    for(int i=7;i>=0;i--) 
    {
         printf("%d ",bin_num1[i]);
    }
    while (val > 0) {
        bin_num2[cnt2] = val % 2;
        val = val / 2;
        cnt2++;
    }
    for(int i=0;i<8;i++)
    {
        bin_num2[i+cnt2] = 0;
    }
   printf("\nThe binary form of given value: ");
    for(int i=7;i>=0;i--) 
    {
         printf("%d ",bin_num2[i]);
    }
    for(int i=0;i<n;i++) 
    {
         bin_dig = bin_dig + multiple*bin_num2[i];
         multiple*=10;
    }
    multiple = 1;
    int temp = bin_dig;
    for(int i=0;i<n;i++) 
    {
        bin_num1[i] = temp%10;
        temp/=10;
    }
    printf("\nThe binary form of given number after replacing is: ");
     for(int i=7;i>=0;i--) 
    {
         printf("%d ",bin_num1[i]);
    }
    for(int i=0;i<cnt1;i++) 
    {
         bin_dig2 = bin_dig2 + multiple*bin_num1[i];
         multiple*=10;
    }
    while ( bin_dig2 > 0)  
    {  
        rem = bin_dig2 % 10;   
        decimal_num = decimal_num + rem * base;  
        bin_dig2 = bin_dig2 / 10;   
        base = base * 2;  
    } 
    printf("\nThe decimal from given number after replacing is: %d\n",decimal_num);
}

void get_nbits_from_pos(int num, int n, int pos)
{
    int bin_num[9];
    int cnt = 0;
    int bin_dig = 0;
    int multiple = 1;
    int decimal_num = 0, base = 1, rem; 
    while (num > 0) {
        bin_num[cnt] = num % 2;
        num = num / 2;
        cnt++;
    }
    for(int i=0;i<8;i++)
    {
        bin_num[i+cnt] = 0;
    }
    printf("\nThe binary form of given number: ");
    for(int i=7;i>=0;i--) 
    {
         printf("%d ",bin_num[i]);
    }
    int from_num = 0;
    for(int i = pos;from_num<n;i--,from_num++) 
    {
         bin_dig = bin_dig + multiple*bin_num[i];
         if(bin_dig==1) multiple*=10;
    }
    while ( bin_dig > 0)  
    {  
        rem = bin_dig % 10;   
        decimal_num = decimal_num + rem * base;  
        bin_dig = bin_dig / 10;   
        base = base * 2;  
    } 
    printf("\nThe decimal number is: %d\n",decimal_num);
}

void replace_nbits_from_pos(int num, int n, int pos, int val)
{
    int bin_num1[9],bin_num2[9];
    int cnt1 = 0,cnt2 = 0;
    int bin_dig = 0,bin_dig2 = 0;
    int multiple = 1;
    int decimal_num = 0, base = 1, rem;
    while (num > 0) {
        bin_num1[cnt1] = num % 2;
        num = num / 2;
        cnt1++;
    }
    for(int i=0;i<8;i++)
    {
        bin_num1[i+cnt1] = 0;
    }
   printf("\nThe binary form of given number: ");
    for(int i=7;i>=0;i--) 
    {
         printf("%d ",bin_num1[i]);
    }
    while (val > 0) {
        bin_num2[cnt2] = val % 2;
        val = val / 2;
        cnt2++;
    }
    for(int i=0;i<8;i++)
    {
        bin_num2[i+cnt2] = 0;
    }
   printf("\nThe binary form of given value: ");
    for(int i=7;i>=0;i--) 
    {
         printf("%d ",bin_num2[i]);
    }
   for(int i=n;i>0;i--) 
    {
         bin_dig = bin_dig + multiple*bin_num2[i];
         if(bin_dig==1) multiple*=10;
    }
    multiple = 1;
    int temp = bin_dig;
    printf("\n%d",bin_dig);
    for(int i=pos;i>(pos-n);i--) 
    {
        bin_num1[i] = temp%10;
        temp/=10;
    }
    printf("\nThe binary form of given number after replacing is: ");
     for(int i=7;i>=0;i--) 
    {
         printf("%d ",bin_num1[i]);
    }
    for(int i=0;i<8;i++) 
    {
         bin_dig2 = bin_dig2 + multiple*bin_num1[i];
         multiple*=10;
    }
    while ( bin_dig2 > 0)  
    {  
        rem = bin_dig2 % 10;   
        decimal_num = decimal_num + rem * base;  
        bin_dig2 = bin_dig2 / 10;   
        base = base * 2;  
    } 
    printf("\nThe decimal from given number after replacing is: %d\n",decimal_num);
}

void toggle_bits_from_pos(int num, int n, int pos)
{
    int bin_num[9];
    int cnt = 0;
    int bin_dig = 0;
    int multiple = 1;
    int decimal_num = 0, base = 1, rem; 
    while (num > 0) {
        bin_num[cnt] = num % 2;
        num = num / 2;
        cnt++;
    }
    for(int i=0;i<8;i++)
    {
        bin_num[i+cnt] = 0;
    }
    printf("The binary form of given number: ");
    for(int i=7;i>=0;i--) 
    {
         printf("%d ",bin_num[i]);
    }
    int from_num = 0;
    for(int i = pos;from_num<n;i--,from_num++)
    {
         bin_num[i] = bin_num[i]^1;
    }
     printf("\nThe binary form of given number after toggling: ");
    for(int i=7;i>=0;i--) 
    {
         printf("%d ",bin_num[i]);
    }
    for(int i=0;i<8;i++) 
    {
         bin_dig = bin_dig + multiple*bin_num[i];
         multiple*=10;
    }
    while ( bin_dig > 0)  
    {  
        rem = bin_dig % 10;   
        decimal_num = decimal_num + rem * base;  
        bin_dig = bin_dig / 10;   
        base = base * 2;  
    } 
    printf("\nThe decimal number is: %d\n",decimal_num);   
}

void print_bits(unsigned int num, int n)
{
    int* bin_num = malloc(n*sizeof(int));
    int cnt = 0;
    int bin_dig = 0;
    int multiple = 1;
    int decimal_num = 0, base = 1, rem; 
    while (num > 0) {
        bin_num[cnt] = num % 2;
        num = num / 2;
        cnt++;
    }
    if(n>num)
    {
        for(int i=0;i<n;i++)
        {
            bin_num[i+cnt] = 0;
        }
    }
    if(cnt>n) 
    {
        printf("The n value is lower than the orignal number of digits\n");
        n = cnt;
    }
    printf("The binary form of given number: ");
    for(int i=n-1;i>=0;i--) 
    {
         printf("%d ",bin_num[i]);
    }
    free(bin_num);
}

I'm a beginner and working with Arrays switch cases and loops of arrays concept coding to do some operations on binary numbers using arrays Here I am able to get the output as expected, but I can't figure out the problem of *** stack smashing detected ***: terminated.我是初学者,正在使用 Arrays 开关盒和 arrays 概念编码循环,使用 arrays 对二进制数进行一些操作在这里,我能够按预期获得 output,但我无法弄清楚 *** 的问题检测到堆栈粉碎 ***:已终止。 This comes at the end of the output I don't know why;这是在 output 的末尾,我不知道为什么; anyone can help me with it please?有人可以帮我吗? And please tell me what the error means.请告诉我错误的含义。

stack smashing occur when one exceeds the size of a specific array(buffer overflow).当超过特定数组的大小时(缓冲区溢出)发生堆栈粉碎。 It a defense mechanism to prevent overwriting of data.它是一种防止数据被覆盖的防御机制。 Please check your for loop in your functions the value of cnt goes beyond 9 which the size of the array.请检查函数中的for循环, cnt的值超过数组大小的 9。 You can also you refer to What is the "stack smashing detected" error?您也可以参考什么是“检测到堆栈粉碎”错误?

This answer is not related for the error, however, using this bit position arithmetic technique you would get rid of the main causes of that error.这个答案与错误无关,但是,使用这个位 position 算术技术,您可以消除导致该错误的主要原因。 In this technique you don't have to use neither arrays nor number base conversions but bit arithmetics only.在这种技术中,您不必既不使用 arrays 也不使用数字基数转换,而只需使用位算术。
Consider the number 105 which would be expressed as 01101001 in 8-bit binary right?考虑一下数字 105 在 8 位二进制中表示为01101001对吧? If it is assigned to an int there will be 24 more digits toward MSb (Most Significant bit).如果它被分配给一个int ,那么 MSb(最高有效位)将多出 24 个数字。 Using bit position arithmetic we can read and print the bit values and we can slice between any 2 positions within the type's bit count range.使用位 position 算法,我们可以读取和打印位值,我们可以在类型的位计数范围内的任意 2 个位置之间进行切片。
Here I show how it could be done using your 2 functions called get_nbits and get_nbits_from_msb_pos (I changed the 2nd one's name to specify the direction operation).在这里,我展示了如何使用名为get_nbitsget_nbits_from_msb_pos的 2 个函数来完成(我更改了第二个函数的名称以指定方向操作)。 I modified their content for this purpose and also added a utility function called printBinary to print binary values of a given int variable, within the desired range.为此,我修改了它们的内容,还添加了一个名为printBinary的实用程序 function,用于在所需范围内打印给定 int 变量的二进制值。

#include <stdio.h>

void printBinary(int val, int from, int to) {
    int bit_count = sizeof(val) * 8;
    if(from < to) {
        printf("Argument error: from cannot be lesser than or equal to to\n");
        return;
    }
    else if(from > bit_count || to < 0) {
        printf("Argument error: Position values out of range\n");
        return;
    }

    for(int i = from; i >= to; i--)
    {
        if((val & (1 << i))) {
            // The ith digit is one
            printf("%d",1);
        }
        else {
            // The ith digit is zero
            printf("%d",0);
        }
    }
}

void get_nbits(int num, int n)
{
    if(n >= (sizeof(num) * 8)) {
        printf("Argument error: The n must not exceed the bit count of num type which is: %lu\n", (sizeof(num) * 8));
        return;
    }

    printf("The binary form of given number: ");
    printBinary(num, n - 1, 0);

    // No need to align since bits ranges to 0th bit
    int decimal_num = num & ((1 << n) - 1);

    printf("\nThe decimal number is: %d\n",decimal_num);
}

// Get bits from Most Significant Bit (from left to right)
void get_nbits_from_msb_pos(int num, int n, int pos)
{
    if((pos - n) < 0) {
        printf("Argument error: n from position should not underflow the bit position\n");
        return;
    }

    int decimal_num = 0;

    printf("The binary form of given number: ");
    printBinary(num, pos, pos - (n - 1));

    int mask = ((1 << (pos + 1)) - 1); // Mask beyond the pos toward MSb
    mask &= ~((1 << ((pos + 1) - n)) - 1); // Mask below pos - n toward LSb
    // Slice the num between the pos and n, and then align it to the right
    // in order to get the correct value
    decimal_num = ((num & mask) >> (pos - (n - 1)));
    printf("\nThe decimal number is: %d\n",decimal_num);
}


int main(void) {

    get_nbits(105, 4);
    get_nbits_from_msb_pos(105, 4, 6);
    return 0;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM