0

我已经用 C 编写了这个函数(函数应该接收一个char*,分配必要的空间,并在给定指针后面的字符索引的情况下插入字符)

void add_to_str(char *character, char ** string, int* index)
{
    //we dont expect  *string to be NULL !! no condition done
    if (*index == 0)    //if str is empty we will alloc AVGLEN(32) characters space
       *string=malloc(AVGLEN*sizeof(char));

    if (*string == NULL)   //malloc fails?
    {
        fprintf(stderr,errors[MALLOC]);
        exit(99);
    }
    //string length exceeds 32 characters we will allocate more space
    if ( *index > (AVGLEN-1) || character== NULL )// or string buffering ended, we will free redundant space
    {
        *string=realloc(*string,sizeof(char)*((*index)+2));//+1 == '\0' & +1 bcs we index from 0
        if (*string==NULL)   //realloc fails?
        {
            fprintf(stderr,errors[REALLOC]);
            exit(99);
        }
    }
    *string[(*index)++]=*character;
}

什么时候*index > 0,它给了我在线上的分段错误

*string[(*index)++]=*character;

这个函数的一个变体(就malloc在后面char*,然后将字符分配给string[i++])完美地工作。

4

3 回答 3

3

你必须小心这个声明:

*string[(*index)++]=*character;

因为数组索引比指针取消引用具有更高的优先级。因此,这与

*(string[(*index)++]) = *character;

这不是你想要的。你要这个:

(*string)[(*index)++] = *character;

错误代码之所以起作用,是*index == 0因为在这种情况下,该语句等效于**string,它仍然有效,但是何时index > 0string将在无效位置取消引用:string+index

于 2013-10-22T19:51:15.570 回答
0

请注意,做这样的事情:

ptr = realloc(ptr, ...);

是一个非常糟糕的模式。当realloc()失败时,您的旧分配区域不再可供程序访问并泄漏。正确的模式是:

char* str_new = realloc(string, ...);

if (str_new != NULL)
    string = str_new;
else
    /* handle allocation error */
于 2013-10-22T20:12:06.040 回答
0

首先,该函数fprintf需要一个格式字符串。

IE

 fprintf(stderr,errors[MALLOC]);

可能是无效的。

还有这个功能的目的是什么。好像没有剧情

于 2013-10-22T20:18:12.953 回答