当字符串达到一定长度时无法释放结构的字符指针元素

Unable to free char-pointer element of a struct when the string reaches a certain length

下面我定义了一个结构来包含一个 char*

类型的元素
struct TokenizerT_ {
    char * name;
};

typedef struct TokenizerT_ TokenizerT;

并且当我创建结构的实例时 TokenizerT,我分配结构及其元素所需的内存,

TokenizerT *TKCreate(char * ts) {
    TokenizerT *t= (TokenizerT *) malloc(sizeof(TokenizerT));
    t->name= (char *) malloc(sizeof(ts));
    strcpy(t->name,ts);
    return t;
}

在 main 函数中,我使用 scanf 通过命令行输入一个字符串并打印出某些可能有助于解决问题的内容,

int main(int argc, char **argv) {
    TokenizerT *token;
    char input[50];
    scanf("%s",input);
    char *pin = input;
    token = TKCreate(pin);

    printf("The address of the tokenizer is %p\n", token);
    printf("The length of the name is %lu\n", strlen(token->name));
    printf("The address of the name is %p\n", token->name);
    printf("The size of the TokenizerT structure is %lu\n", sizeof(TokenizerT));
    printf("The name starting from character 27 is %s\n", token->name + 26);   
    pin=token->name;
    printf("The whole name is %s\n",pin);

    TKDestroy(token);

    return 0;
}

问题是由我的 TKDestroy 方法引起的,在该方法中我释放了结构的唯一成员,但我不确定为什么,

void TKDestroy( TokenizerT * tk ) {
    free(tk->name);
    //free(tk);
}

当运行程序输入长度为26或更小的字符串时,程序运行正常,没有错误。

但是一旦我输入超过 26 个字符的字符串,就会发生这种情况

我知道错误是在我释放结构的字符指针时引起的,因为我注释掉了释放整个结构实例的行。此外,更改 char 数组的大小 input 似乎对输出没有影响。该错误似乎仅在我尝试释放指向长度超过 26 的字符串的结构的 char 指针时才会发生。有人告诉我,这通常与尝试释放未分配或已分配的内存有关被访问禁止。但是我仍然能够访问第 26 个字符之后的字符的内存地址。为什么会这样?

您可以尝试移除

的内存分配
       t->name 

并将其更改为

     t->name=ts;

此外,您必须删除命令

    strcpy(t->name,ts);

因为该作业是由上一个命令执行的。那么它应该给你 没有错误。 就 TKDestroy(..) 而言,您可以包含您评论的命令,即

    free(tk); 

希望这些帮助。