【发布时间】:2014-06-05 14:31:10
【问题描述】:
有一个功能。它是 add_lexem 并在指定数组的末尾添加一个元素(char *)。如果没有剩余内存,它会分配一些额外的内存 (100 * sizeof(char *))。该函数会导致段错误,这就是问题所在。
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
void add_lexem(char **lexems, int *lexemsc, int *lexem_n, const char *lexem)
{
if (*lexem_n >= *lexemsc) {
lexems = realloc(lexems, sizeof(char *) * (*lexemsc + 100));
*lexemsc += 100;
}
char *for_adding = malloc(sizeof(char) * strlen(lexem));
strcpy(for_adding, lexem);
lexems[*lexem_n] = for_adding;
(*lexem_n)++;
}
int main(void)
{
char **D = malloc(sizeof(char *) * 2);
int lexemsc = 2;
int lexem_n = 0;
add_lexem(D, &lexemsc, &lexem_n, "MEOW");
printf("%s\n", D[0]);
add_lexem(D, &lexemsc, &lexem_n, "BARK");
printf("%s\n", D[1]);
// in this place lexem_n becomes equal lexemsc
add_lexem(D, &lexemsc, &lexem_n, "KWARK");
printf("%s\n", D[2]);
return 0;
}
输出必须是
MEOW
BARK
KWARK
但它是
MEOW
BARK
Segmentation fault (core dumped)
【问题讨论】:
-
如果您的意图是
char指针的扩展数组,您似乎缺少一级间接。 IE。D也必须通过地址传递,形式参数应该是char *** lexems(我也不喜欢它,因为一旦你通过了 2 级间接,事情可能会很快向南,但它似乎适合你正在尝试做)。 -
避免三星问题的干净方法是将
char **和大小+使用的值放在一个结构中,从而也避免需要三个指针传递的参数。
标签: c segmentation-fault realloc