编辑:我应该添加我如何设置这一切。结构定义和原型在mystring.h中。函数定义在mystring.c中。主要在mystringtest.c中。对于mystring.c和mystringtest.c,我在顶部有#include "mystring.h"
。我正在编译gcc -o test.exe mystring.c mystringtest.c
。不确定是否有任何重要,但我是C的新手,所以我只想包括一切。
我对Java有很多经验但对C来说很新。我想这与指针和内存有关但我在这里完全不知道发生了什么。这是我的代码:
typedef struct {
char *chars;
int length;
int maxSize;
} String;
int main() {
char *a;
a = readline();
String *s = newString(a);
int b = length(s);
printf("length is %d \n", b);
}
我运行程序并输入“hello”(由readline()提示)。我已经完成了程序,经过长度,s->字符仍然是指向字符'hello'数组的指针。在print语句之后,s->字符变为指向字符数组的指针'Length is%d \ n'。因为我做错了,我完全不知所措。如果重要的话,我正在研究虚拟机。任何帮助是极大的赞赏。我也会给出newString和length的代码。
int length(String *s) {
char *temp = s->chars;
char b = *temp;
int count;
if (b == '\0') { count = 0; }
else { count = 1; }
while (b != '\0') {
b = *(temp+count);
count++;
}
return count;
}
String *newString(char *s) {
String st;
st.length = 20;
st.maxSize = MAXCHAR;
char *temp = malloc(20 * sizeof(char));
char b = *s;
int count = 0;
while (b != '\0') {
*(temp + count) = b;
count++;
b = *(s+count);
if (count == st.maxSize) { break; }
if (count == st.length) {
st.length = st.length + 20;
temp = realloc(temp, st.length * sizeof(char));
}
}
st.chars = temp;
return &st;
}
答案 0 :(得分:3)
String *newString(char *s) {
String st;
...
return &st;
}
您正在返回指向局部变量的指针。返回newString后,局部变量不再存在,因此您有一个悬空指针。
使用malloc
分配st,或按值返回。
答案 1 :(得分:0)
你必须在while循环之后null终止字符串,你没有为null终止符留空间。另外我不明白为什么你需要重新分配
//using strlen will eliminate the need for realloc, +1 is for the null terminator
int len = strlen(s)
char *temp = malloc((len * sizeof(char)) +1);
//null terminate
*(temp+count) = '\0';
st.chars = temp;