C 创建一个字符串结构

C creating a String Stuct

所以,我一直致力于为字符串实现这个结构。但是,我在调用 *createString();

时不断出现分段错误

这里是.h内容

typedef struct {
    char *characters;
    int length;
} String;

String *createString();

这是我的 .c 文件中的实现

String *createString(){
    char *m,b;
    int n = 0;
    String *theS = (String *) malloc (sizeof(String));
    m = theS->characters;
    b = getchar();
    while((b = getchar()) != '\n'){
        *(m+n) = b;
        n++;
        m = realloc(m, n+1);
    }
    *(m+n) = '[=11=]';
    theS->length = strlen(theS->characters);
    return new;
}

正如@HuStmpHrr 所建议的:当您分配 String 时,您不会为其 characters 字段分配任何指向的 space,因此当您尝试访问什么它指出,事情会变坏。

问题 1

Q:在这一行之后:

String *theS = (String *) malloc (sizeof(String));

theS->characters 指向什么?

A:谁知道呢?不过没啥用。

您至少需要分配一个字符,以容纳最终插入的 '[=17=]'

String *theS = malloc (sizeof(String));
theS->characters = malloc(1);

问题 2

然后你到处修改 m,但永远不会将该值重新分配给 theS->characters,所以当你说

theS->length = strlen(theS->characters);

这不会是一个很有帮助的答案。

在那行之前,添加:

theS->characters = m;

问题 3

return new;

大概应该是:

return theS;

问题 4

您正在丢弃第一个字符。只需删除独立的 b = getchar(); 行。

工作示例:

https://ideone.com/tm1TG9

使用您的风格而不检查分配错误:

String *createString(){
    int n = 0;
    char *m = malloc(1);
    int c;
    String *theS = (String*)malloc(sizeof(String));
    while ((c = getchar()) != EOF && c != '\n') {
        m = realloc(m, n + 2);
        m[n] = c;
        n++;
    }
    m[n] = '[=10=]';
    theS->characters = m;
    theS->length = n;
    return theS;
}