所以我正在尝试创建一个简单的String结构,它将包含字符串的文本及其大小,至少目前是这样。但是我在分配我的结构时遇到了问题。现在我只是试着让1个字符的大小工作,但它只是在这一点崩溃,我不知道我的配置有什么问题,请帮忙。
#include <stdio.h>
#include <stdlib.h>
typedef struct{
char* text;
int size;
}String;
String* getString();
int main(int argc, char** argv){
String* str1 = getString();
printf("%s",str1->text);
free(str1);
return 0;
}
String* getString(){
String* str = (String*)malloc(sizeof(String));
scanf("%s",str->text);
str->size++;
return str;
}
答案 0 :(得分:2)
您需要为结构分配内存,还需要为text
字符串分配内存。
scanf("%s",str->text);
str->text
是一个未初始化的指针。
答案 1 :(得分:2)
您没有为str->text
分配任何内存。你保持未初始化,所以你的程序会调用未定义的行为。
您需要使用str->text = malloc(MAX_SIZE);
为其分配内存,其中MAX_SIZE
是字符串的最大大小。或者,如果您的字符串很短,则可以使用常规的fixed-szie数组。
此外,您可能不希望使用scanf()
来扫描字符串。一个特别的原因是%s
使scanf()
停在第一个空格字符处。另一个原因是,如果scanf()
太小,阻止fgets()
写入缓冲区并非易事。如何使用fgets(str->text, MAX_SIZE, stdin);
呢?
{{1}}
是一种更好,更安全的方法。
答案 2 :(得分:0)
int main(int argc, char** argv){
String* str1 = getString();
printf("%s",str1->text);
free(str1->text);
free(str1);
return 0;
}
String* getString(){
String* str = (String*)malloc(sizeof(String));//for struct
str->size = 16;//initialize
str->text = (char*)malloc(sizeof(char)*str->size);//for input text
int ch, len;
while(EOF!=(ch=fgetc(stdin)) && ch != '\n'){
str->text[len++]=ch;
if(str->size==len){
str->text = realloc(str->text, sizeof(char)*(len+=16));
}
}
str->text[len++]='\0';
str->text = realloc(str->text, sizeof(char)*(str->size=len));
return str;
}