debugging 为什么我的直方图实现出现了分段错误,即使它不应该出现,因为我正在寻找边界内的值?

t5fffqht  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(116)

所以,我实现的直方图,基本上把一个字符串作为输入,把它分成单词,然后把单词的长度作为索引,输出是一个整数数组。a[p]++,如果strlen(s)==p基本上。我的代码要么打印一个零,要么根本不工作。为什么?代码是:

#include <stdio.h>
#define BUFFER_SIZE 1024
#define array_size(_S) 5000 //didn't want to edit code, this used to be a formula.

//an input function I coded when I was a beginner.
void input_str(char * str, int delimeter, int bound)
{
    int inpchar;
    register int incvar = 0;
    while (incvar < bound)
    {
        inpchar = getchar();
        if(inpchar == '\n' || inpchar == delimeter)
        {
            *(str+incvar) = '\0';
             return;
        }
        *(str+(incvar++))=inpchar;
    }
    *(str+incvar) ='\0';
}

//old code I used
int lenstr(char * str)
{
    register int varinc = 0;
    while( *(str + varinc) != '\0')
    {
        varinc++;
    }
    return varinc;
}

void xprintf(const char *s)
{
    int counter = 0;
    while ( *(s + counter) != '\0')
    {
        putchar(*(s + counter));
        counter++;
    }
}

void initialize(int **a, unsigned int len)
{
    int counter = 0;
        while(counter < len)
        {
            *(a + counter) = 0;
             counter++;
        }
}

int main(void)
{
    char inp_str[BUFFER_SIZE + 1];
    printf("Enter full string.\n");
    input_str(inp_str,-1,BUFFER_SIZE);
    int ncounter = 0;
    int ecounter = 0;
    int frequency_array[ array_size(inp_str)];
    intialize (frequency_array, array_size(inp_str));
    int real_length = lenstr(inp_str);
    while (ncounter <= real_length)
    {
        while(*(inp_str + (ncounter + ecounter)) != ' ' && *(inp_str +(ncounter + ecounter)) !='\0')
        {
            ecounter++;
        }
        frequency_array[ecounter]++;
        ncounter = ncounter + ecounter + 2;
        ecounter = 0;
    }
    ncounter = 0;
    while (ncounter < array_size(inp_str))
    {
        putchar(*(frequency_array + ncounter) + '0');
        ncounter++;
    } 
    return 0;
}

现在,它只是segfaults。

svmlkihl

svmlkihl1#

intialize (frequency_array, array_size(inp_str));
您拼错了initialize,因此它给出了一个错误,请写入initialize(frequency_array, array_size(inp_str));来修复该错误。
void initialize(int **a, unsigned int len)
两个星号('*')意味着它是指向指针的指针,但是从它的使用和实现来看,您希望它与常规数组/指针一起工作。因此,只需将它更改为void initialize(int *a, unsigned int len)
同样,当这段代码编译无误时,就像我在修复了我提到的问题后所做的那样,它打印出了一个大得离谱的字符串。这是因为array_size(inp_str)宏总是等于5000,而不是数组的大小。该数组的实现如下:
#define array_size(s) (sizeof(s) / sizeof(s[0]))
这将除以数组的总大小(以字节为单位),再除以单个元素的大小,从而得出大小。
这应该可以修复segfault并帮助处理其他错误。希望这能有所帮助!

相关问题