我写了一些代码来创建一个动态的字符串数组,一旦充满,它就会自动调整大小。 即使在其中插入元素似乎没有问题,但在尝试打印所有插入的值时却出现了段错误。
我为数组定义了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]);
}
答案 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()
的结果,并在失败时采取适当的措施。