【问题标题】:Dynamic Array of Strings Causes Segfault字符串的动态数组导致 Segfault
【发布时间】:2020-03-14 05:34:23
【问题描述】:

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

我已经为数组定义了一个 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:想想realloc 返回的结果。提示 2:如何从函数返回值(如新指针)?
  • @Someprogrammerdude 是对的,他的意思是 --> 在 realloc 之后更新指针
  • @Someprogrammerdude 不应该像下面这样工作吗? void *tmp = realloc(concordance, max_size); if (tmp != NULL) { concordance = tmp; }
  • @JoaquinPletcher 这是一个开始。现在考虑如何返回新的concordancè 指针。

标签: c arrays segmentation-fault


【解决方案1】:

除了不存储从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() 的结果,并在失败时采取适当的措施。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2012-11-13
    • 2017-08-27
    • 1970-01-01
    相关资源
    最近更新 更多