printf覆盖seeminlgy不相关的数据?

时间:2014-02-24 00:39:31

标签: c pointers

编辑:我应该添加我如何设置这一切。结构定义和原型在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;
}    

2 个答案:

答案 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;