簡體   English   中英

檢查 C 中的 NULL 指針分段錯誤

[英]Checking NULL pointer segmentation fault in C

我必須拆分一個初始字符並創建一個必須以 NULL 結尾的所述字符的列表,這樣我就可以在不知道列表大小的情況下進行主要迭代。 問題是,每當我嘗試檢查最后一個元素是否為 NULL 時,都會出現 seg 錯誤。 對不起,我仍在努力學習 C 和英語。 謝謝你們

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

char **split(const char *s) {
    char **split;
    unsigned m_size = 0, c_size, i, j, k;

    // get s size
    for (i = 0; s[i] != '\0'; i++) {
        if (s[i] == ' ') {
            m_size++;
        }
    }
    m_size++;

    split = (char**) malloc(sizeof(char) * (m_size + 1));

    int sizes[m_size];
    c_size = 0;

    // get s words size
    for (i = 0, j = 0; s[i] != '\0'; i++) {
        if (s[i] == ' ') {
            c_size++;
            sizes[j] = c_size;
            c_size = 0;
            j++;
        } else {
            c_size++;
        }
    }
    sizes[j] = c_size;

    for (i = 0; i < m_size; i++) {
        split[i] = (char *) malloc(sizeof(char) * sizes[i]);
    }
    split[i] = NULL;

    for (i = 0, j = 0, k = 0; s[i] != '\0'; i++) {
        if (s[i] != ' ') {
            split[j][k] = s[i];
            k++;
        } else {
            split[j][k] = '\0';
            j++;
            k = 0;
        }
    }

    return split;
}

int main() {
    char s[19] = "hello how are you?";
    char **splitted;
    unsigned i;
    splitted = split(s);
    if (splitted == NULL) {
        return 1;
    }
    for (i = 0; splitted[i]!=NULL; i++) {
        printf("%s\n", splitted[i]);
    }
    return 0;
}

編輯

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

char **split(const char *s) {
    char **r;
    unsigned word_size = 0;
    unsigned list_size = 0, i, j, k;

    // get s size
    for (i = 0; s[i] != '\0'; i++) {
        if (s[i] != ' ') {
            word_size++;
        } else {
            if (word_size > 0) {
                list_size++;
                word_size = 0;
            }
        }
    }
    list_size++;

    r = malloc(sizeof(*r) * (list_size + 1));

    int char_sizes[list_size];
    for (i = 0; i < list_size; char_sizes[i] = 0, i++);

    // get s words size
    for (i = 0, j = 0; s[i] != '\0'; i++) {
        if (s[i] != ' ') {
            char_sizes[j]++;
        } else {
            if (char_sizes[j] > 0) {
                j++;
            }
        }
    }

    for (i = 0; i < list_size; i++) {
        r[i] = malloc(sizeof(char) * char_sizes[i]);
    }
    r[i] = NULL;

    for (i = 0, j = 0, k = 0; s[i] != '\0'; i++) {
        if (s[i] != ' ') {
            r[j][k] = s[i];
            k++;
        } else {
            if (k > 0) {
                r[j][k] = '\0';
                j++;
                k = 0;
            }
        }
    }

    return r;
}

void destroy(char **list) {
    unsigned i;
    for (i = 0; list[i] != NULL; i++) {
        free(list[i]);
    }
    free(list);
}

int main() {
    char s[100] = " hello    guys how are?   you,d 31 3  ";
    char **splitted;
    unsigned i;
    splitted = split(s);
    if (splitted == NULL) {
        return 1;
    }
    for (i = 0; splitted[i]!=NULL; i++) {
        printf("%s", splitted[i]);
    }
    destroy(splitted);
    return 0;
}

好吧,伙計們,我遵循了您的提示,並編輯了我的代碼。 如果有人想指出其他錯誤,我將不勝感激。 現在它甚至可以使用多個空格。 謝謝大家

您正在請求一個指向 char 的指針的“數組”,但您正在分配一個字符的“數組”:

split = (char**) malloc(sizeof(char) * (m_size + 1));

應該成為

split = malloc(sizeof(char*) * (m_size + 1));

注意sizeof(char*) 順便說一句:請注意,在 C 中,您不應按照SO 帖子中的說明malloc的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM