1

这段代码有时会给我一个分段错误,为什么会这样?

void concatenarAlBuffer(char **destino, char caracter)
{
char matrizAux[1];
matrizAux[0]=caracter;
matrizAux[1]='\0';

(*destino) = realloc((*destino),2+(strlen((*destino))*sizeof(char)));

if ((*destino)==NULL)   
{                               
    perror("Error al reservar memoria\n");
    exit(-1);                               
}

strcat((*destino),matrizAux);
}
4

3 回答 3

1

matrizAux只能容纳一个字符。您无法访问matrizAux[1]- 它超出了范围。

像这样声明matrizAux

char matrizAux[2];

请记住,n-elements 数组可以在从 0 到(包括)的位置进行索引n-1

此外,您不需要sizeof(char),因为它始终为 1。*destino在这种情况下,括号是无用的,并且使代码更难于不必要地阅读。以下是我将如何更改您的代码:

void concatenarAlBuffer(char **destino, char caracter) {
    char matrizAux[2];
    matrizAux[0]=caracter;
    matrizAux[1]='\0';

    *destino = realloc(*destino,2+strlen(*destino));

    if (*destino == NULL) {                               
        perror("Error al reservar memoria\n");
        exit(-1);                               
    }

    strcat(*destino, matrizAux);
}
于 2013-11-02T14:41:44.580 回答
1

你做

char matrizAux[1];

一个 1 字符长的数组。
然后你写到它的第二个元素

matrizAux[1]='\0';

这可能会或可能不会崩溃,具体取决于内存中数组背后的内容。
但它看起来仍然缺少一些东西。
realloc只能重新分配以前malloc- 或calloc-ated 的东西。
尝试重新分配不满足此条件的东西会给您带来错误。这可能就是这里的真实情况。

于 2013-11-02T14:41:52.183 回答
0

char matrizAux[1]只保留一个字符。由于您正在访问matrizAux[1],即超出范围的内容,因此您正在破坏内存。这可能会导致运行时的内部数据被破坏,从而导致运行期间的段realloc()错误,即使 realloc 本身是正确的。

于 2013-11-02T15:04:22.017 回答