是什么改变了我的C字符串中的字符值



我的代码中的某些东西神秘地用垃圾值替换了我的const char *(字符串upper,在foo_add()内)中的所有char s。它似乎发生在foo_add()中对malloc的调用之后。我在Xcode中设置了断点,uppermalloc调用之前就可以了,但后面填充了随机值。我是一个完全的C语言新手,所以完全有可能我正在做的事情有一些我没有意识到的副作用。我不知道它是否与malloc有关,我也不明白为什么会这样。下面的代码。我添加了注释来显示问题发生的位置。

//in Foo.h
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
typedef struct Foo {
    struct Foo * members[26] ;
} Foo ;
const char * toUpper(const char * in) ;
const char * getSubstring(const char * str, size_t startingIndex) ;
void foo_init(Foo * f) ;
void foo_add(Foo * f, const char * str) ;
//in Foo.c
#include "Foo.h"
const char * toUpper(const char * in) {
    size_t length = strlen(in) ;
    char temp[length + 1] ;
    for (size_t i = 0 ; i < length; i++) {
        temp[i] = toupper(in[i]) ;
    }
    temp[length] = '' ;
    char * out = temp ;
    return out ;
}
const char * getSubstring(const char * str, size_t startingIndex) {
    size_t size = (unsigned)(strlen(str) - startingIndex) ;
    char temp[size + 1] ; //+1 for '' (terminating char)
    for (size_t i = 0 ; i < size ; i++) {
        temp[i] = str[i + startingIndex] ;
    }
    temp[size] = '' ;
    const char * ret = temp ;
    return ret ;
}
void foo_init(Foo * f) {
    for (size_t i = 0 ; i < 26 ; i++) {
        f->members[i] = NULL ;
    }
}
void foo_add(Foo * f, const char * str) {
    const char * upper = toUpper(str) ;
    int index = ((int)upper[0]) - 65 ;
    size_t length = strlen(str) ;
    if (length > 0) {
        if (f->members[index] == NULL) {
            /* debugger says upper = "ABCXYZ" here, which is expected */
            f->members[index] = (Foo *)malloc(sizeof(Foo)) ;
            /* set another debugger breakpoint here - upper is now filled with garbage values */
        }
        /* take substr and call recursively until length == 0 */
        const char * next = getSubstring(upper, 1) ;
        foo_add(f->members[index], next) ;
    }
}
//in main.c
#include <stdio.h>
#include "Foo.h"
int main(int argc, const char * argv[])
{
    Foo f ;
    foo_init(&f) ;
    const char * str = "abcxyz" ;
    foo_add(&f, str) ;
    return 0;
}

罪魁祸首是这段代码:

const char * function(const char * in) {
  char temp[..];
  char *out = temp;
  return out;
}

这里,temp是在堆栈上分配的,而不是在堆上。这意味着它的生命周期在函数的作用域退出时结束。您应该在堆上动态地分配它,例如使用char *temp = calloc(length+1, 1),或者在预分配的空间(此时可能在堆栈上)上调用它。

相关内容

  • 没有找到相关文章

最新更新