我需要一个包含单个字符串的结构声明,然后我可以创建一个数组(所以基本上是一个指向字符串的指针数组)。我知道如何创建一个结构数组,每个结构包含一个字符串:
typedef char line_t[MAX_INPUT + 1];
typedef struct {
line_t text;
} lines;
lines *arrayoflines;
arrayoflines = (char *)calloc(MAX_INPUT + 1, sizeof(char));
这里没问题。但是,如果字符串中需要存储的字符数超过MAX_INPUT
的范围,该怎么办?我觉得我需要重新分配char line_t[MAX_INPUT + 1]
,这就是我完全不知道该怎么做。
编辑:似乎有些人认为字符串数组中的字符串数量是个问题。我的意思是重新分配字符串的长度,该字符串可以存储在字符串数组中的每个元素中。
答案 0 :(得分:3)
最好为每一行分配内存。即而不是静态数组数组line_t[MAX_INPUT + 1]
定义char
指针数组:char ** arrayoflines
。
答案 1 :(得分:2)
您对数组中定义的最大行数有限制。所以,我假设任何给定的行永远不会超过(如果这个假设是错误的,你应该检查你的输入)。你可以在line_t中读取一个较短的行(通过用NULL终止你的字符串),但你不会恢复内存中的空间。如果您没有预期的行数,那么您的固定缓冲区方法将起作用,即您不需要重新分配。
但是,如果您需要提高空间效率,可能因为您将读取数百万行,则应为每行分配内存。换句话说,您可以考虑将line_t更改为char *而不是char [MAX_INPUT + 1]。它们在语义上与您的编程目的相同。但在幕后,你没有设定固定的尺寸。
typedef char* line_t;
line_t *arrayoflines;
arrayoflines = calloc(1, sizeof(line_t));
arrayoflines[0] = calloc(MAX_INPUT + 1, sizeof(char));
//if you learn the size after reading into the buffer, and it's smaller,
// realloc the buffer - be sure to include space for NULL and be sure it
// is set to NULL
arrayoflines[0] = realloc(arrayoflines[0], (new_smaller_count+1) * sizeof(char))
arrayoflines[0][new_smaller_count] = NULL;
答案 2 :(得分:0)
如果无法确保所有输入都小于或等于MAX_INPUT,则必须转换为动态分配。 你必须这样做:
typedef struct {
char * text;
} lines;
lines *arrayoflines;
arrayoflines = calloc(MAX_LINES, sizeof(lines));
并且每个(n)元素为该特定元素分配THE_DESIRED_INPUT_SIZE;
arrayoflines[n].text=calloc(THE_DESIRED_INPUT_SIZE, sizeof(char));
(n)在[0,MAX_LINES-1]
的范围内