细分错误(c),我不知道怎么了?

时间:2020-06-11 19:35:21

标签: c memory-leaks segmentation-fault

我不断收到细分错误错误,但似乎找不到问题所在。

例如:

输入:4 bbbb

输出:2 abab

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

int main() {
    int a, len, i = 0, count = 0;
    scanf("%d", &a);
    len = a;
    char *strn = malloc((len * sizeof(char*)) + 1);
    scanf("%s", strn);

    while (i != len) {
        if (strn[i]=='a' && strn[i+1]=='a') {
            strn[i] = 'b';
            count++;
            i++;
        } else if (strn[i]=='b' && strn[i+1]=='b') {
            strn[i] = 'a';
            count++;
            i++;
        } else {
            i+=2;
        }
    }

    printf("%d\n%s\n", count, strn);
    free(strn);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

对于初学者来说,这种内存分配方式

char *strn = malloc((len * sizeof(char*)) + 1);
                                  ^^^^^^

不正确。

看来你的意思

char *strn = malloc((len * sizeof(char)) + 1);

循环中的条件

while (i != len) {

可以调用未定义的行为,因为由于else语句,变量i的值可以绕过变量len中的值

    } else {
        i+=2;
    }

,并使用表达式i + 1作为索引,因为例如,当i等于3时,strn[i + 1]等于结尾的零'\0',并且将执行else语句,该语句将使i增加2

您可以像这样重写while语句

while (i + 1 < len) {