C创建一个String Struct

时间:2015-02-26 20:28:19

标签: c string struct segmentation-fault

所以,我一直在为String实现这个结构。但是,在调用* 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) = '\0';
    theS->length = strlen(theS->characters);
    return new;
}

3 个答案:

答案 0 :(得分:2)

正如@HuStmpHrr建议的那样:当你分配String时,你没有为其characters字段分配任何空间来指向,所以当你试图访问它所指向的内容时,事情会发生变坏了。

答案 1 :(得分:2)

问题1

:在此行之后:

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

theS->characters指向什么?

A :谁知道?但是,无处可用。

您需要至少分配一个字符,以容纳最终插入的'\0'

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

答案 2 :(得分:0)

使用您的样式而不检查分配错误:

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] = '\0';
    theS->characters = m;
    theS->length = n;
    return theS;
}