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();
行。
工作示例:
使用您的风格而不检查分配错误:
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;
}
所以,我一直致力于为字符串实现这个结构。但是,我在调用 *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();
行。
工作示例:
使用您的风格而不检查分配错误:
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;
}