为什么我的 malloc(1) 会导致我的程序出现段错误?

问题描述 投票:0回答:1

这是我第一次在这里问问题,我希望我做得对。我的 C 程序中有一个问题,导致它在 malloc(1) 上出现段错误。我花了很多时间试图找出它出现段错误的原因,但我就是无法弄清楚。我的程序的这一部分使用标识符分隔字符串。例如,字符串=“12wo4ne53wone86wo99w5ne”;标识符,开始=“wo”,结束=“ne”;将返回 {"wo4ne", "wone", "wo99w5ne"}。我的代码如下...

// basically like substring() in java
char* stringAt(char* str, int start, int end) {
    int length = end - start + 1;
    int temp = start;
    char* savedChar = NULL;
    savedChar = malloc(length + 1);
    for(int x = 0; x < length; x++) {
        savedChar[x] = str[temp];
        temp++;
    }
    savedChar[length] = '\0';
    return savedChar;
}

// finds "identifier" in string after certain position in that string
int findIdentifier(char* str, char* identifier, int pos, int isEnd) {

    // checks first character with first character in "identifier"
    for(int x = pos; x < strlen(str) - 1; x++) {
        if(str[x] == identifier[0]) {

            // if first characters match then check rest
            for(int i = 0; i < strlen(identifier); i++) {
                if(str[x + i] != identifier[i]) {
                    i = strlen(identifier);
                }
                if(i == strlen(identifier) - 1) {

                    // isEnd checks if you should count the last position of the identifier...
                    // -like ident="1234" then "end" is the position of "4".
                    // -not end be the position of "1"
                    if(isEnd == 1) {
                        return x + strlen(identifier) - 1;
                    }
                    return x;
                }
            }
        }
    }
    return -1;
}

char** separateStrings(char* str, char* identifier, char* lastIdentifier) {
    char** savedStr = NULL;

    // segfault here!
    savedStr = malloc(1);
    // segfualt here!

    int start = -2;
    int end = 0;
    int x = 0;
    do {

    // first run check/gets first and last positions of the identifier in the string
    if(start == -2) {
        start = findIdentifier(str, identifier, 0, 0);
    } else {
    start = findIdentifier(str, identifier, end + 1, 0);
    }
    end = findIdentifier(str, lastIdentifier, start + 1, 1);
    
    if(start != -1) {
        if(end == -1) {
            end = strlen(str);
        }
        char* newStr = stringAt(str, start, end);

        // dynamically increase the size of savedStr (x is iterated every run through here)
        realloc(savedStr, x + 1);
        savedStr[x] = malloc(strlen(newStr) + 1);
        strcpy(savedStr[x], newStr);
        x++;
    }

    } while(start != -1 && end != -1);
    return savedStr;
}

我尝试查找为什么这不起作用,我唯一能想到的是缓冲区溢出。因此,我尝试运行 findIdentifier() 多次,但效果很好。该程序也不一致,有时比其他程序运行得更深入,但其结果是准确的。感谢您的帮助!

c segmentation-fault malloc realloc buffer-overflow
1个回答
0
投票

如果

savedStr
应该是动态分配的字符串数组,则分配 1 个字节的内存不足以存储指向
char
的指针(根据您的平台,这需要 4 或 8 个字节)。

即使您将其重新分配得更大,一次也仅添加 1 个字节。当您使用

savedStr[x] = malloc(strlen(newStr) + 1);
引用和分配时,您正在调用未定义的行为,在这种情况下,这似乎表现为分段错误。

你几乎肯定想要分配:

savedStr = malloc(sizeof(char *));

然后当你重新分配时:

realloc(savedStr, (x + 1) * sizeof(char *));
© www.soinside.com 2019 - 2024. All rights reserved.