所以,我一直在为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;
}
答案 0 :(得分:2)
正如@HuStmpHrr建议的那样:当你分配String
时,你没有为其characters
字段分配任何空间来指向,所以当你试图访问它所指向的内容时,事情会发生变坏了。
答案 1 :(得分:2)
问:在此行之后:
String *theS = (String *) malloc (sizeof(String));
theS->characters
指向什么?
A :谁知道?但是,无处可用。
您需要至少分配一个字符,以容纳最终插入的'\0'
。
String *theS = malloc (sizeof(String));
theS->characters = malloc(1);
然后,您可以在整个地方修改m
,但永远不要将该值重新分配给theS->characters
,所以当您说
theS->length = strlen(theS->characters);
这不是一个非常有用的答案。
在该行之前,添加:
theS->characters = m;
return new;
应该是:
return theS;
你丢掉了第一个角色。只需删除独立的b = getchar();
行。
答案 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;
}