动态字符串数组导致段错误

时间:2019-11-18 19:22:50

标签: c arrays segmentation-fault

我写了一些代码来创建一个动态的字符串数组,一旦充满,它就会自动调整大小。 即使在其中插入元素似乎没有问题,但在尝试打印所有插入的值时却出现了段错误。

我为数组定义了10个开始大小,并且我假设数组中的每个字符串都不得超过30个字符。

在执行main()时,程序应该为10个char指针分配足够的内存,并且对于这些指针中的每个指针,在initialize_concordance()函数中分配了足以容纳30个字符的字符串的内存。

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

#define MAX_STRING_LENGTH 30
#define EXTENSION_STEP 10

int size = 0;
int max_size = 10;

void initialize_concordance(char **concordance) {

    for (int i = size; i < max_size; i++) {

        concordance[i] = malloc(MAX_STRING_LENGTH * sizeof(char));

    }

}

void push(char **concordance, char *word) {

    if (size >= max_size) {

        max_size += EXTENSION_STEP;
        realloc(concordance, max_size);
        initialize_concordance(concordance);

    }

    concordance[size] = word;
    size++;

}

int main(int argc, char** argv) {

    char **concordance = malloc(max_size * sizeof(char*));
    initialize_concordance(concordance);

    char *wordRead = "Hello";

    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);
    push(concordance, wordRead);

    printf("%s\n", concordance[0]);
    printf("%s\n", concordance[1]);
    printf("%s\n", concordance[2]);
    printf("%s\n", concordance[9]);
    printf("%s\n", concordance[10]);
    printf("%s\n", concordance[3]);
    printf("%s\n", concordance[4]);

}

1 个答案:

答案 0 :(得分:0)

除了不存储从realloc()返回的指针外,对realloc()本身的调用未正确传递。您需要乘以指针的大小,就像调用malloc()时一样。

此外,由于concordance必须在push()返回之前进行修改,因此您需要将其指针传递到push()

void push(char ***concordance, char *word) {

    if (size >= max_size) {

        max_size += EXTENSION_STEP;
        void *tmp = realloc(*concordance, max_size * sizeof(char *));
        if (tmp == NULL) {
            /* ... handle failure */
            return;
        }
        *concordance = tmp;
        initialize_concordance(*concordance);

    }

    (*concordance)[size] = word;
    size++;

}

因此,在main()中,您将不得不更改呼叫方式push()

    push(&concordance, wordRead);

提醒一下,您还应该检查每次调用malloc()的结果,并在失败时采取适当的措施。