正在获取堆栈错误:0 [main] stringL 1123 cygwin_exception :: open_stackdumpfile:将堆栈跟踪信息转储到stringL.exe.stackdump

问题描述

我已经定义了一个表示字符串的结构,并希望从该字符串结构中列出一个列表。我已经编写了一个toString函数,该函数获取一个char指针,结果是这样的字符串结构。我已经编写了一个函数toList,该函数获取char指针的指针,从这些char指针生成字符串,并将它们连接到字符串列表。

现在,我想使用它们,但是我总是会遇到此堆栈错误0 [main] stringL 1123 cygwin_exception::open_stackdumpfile: Dumping stack trace to stringL.exe.stackdump。问题可能是与makro进行分配吗?甚至没有输出调试输出0、1、2、3。感谢您的帮助。

代码

#include<stdio.h>
#include<stdlib.h>

#define EMPTYLIST NULL
#define ISEMPTY(l) ((l) == EMPTYLIST)
#define TAIL(l) ((l)->next)
#define HEAD(l) ((l)->str)

typedef struct {
    char *str;
    unsigned int len;
} String;

typedef struct ListNode *StringList;

struct ListNode {
    String str;
    StringList next;
};

String toString (char *cstr) {
    String res = {NULL,0};
    res.str = malloc(sizeof(char));
    
    char *ptr = res.str;
    
    while(*cstr) {
        *ptr++ = *cstr++;
        res.str = realloc(res.str,sizeof(char) * (res.len +2));
        res.len++;
    }
    *ptr = '\0';
    return res;
}

StringList toList (char **cstrs,unsigned int sc){
    if(sc > 0) {
        StringList res = malloc(sizeof(*res));
        HEAD(res) = toString(*cstrs);
        TAIL(res) = toList(cstrs+1,sc+1);
    }
    return EMPTYLIST;
}

int main() {
    printf("0");
    char **strs = malloc(sizeof(**strs) *2);
    unsigned int i = 0;
    char *fst = "Der erste Text";
    char *snd = "Der zweite Text";

    printf("1");
    StringList res = toList(strs,2);
    StringList lstPtr = res;

    strs[0] = malloc(sizeof(char) * 15);
    strs[1] = malloc(sizeof(char) * 16);
printf("2");
    while(*fst) {
        strs[0][i] = *fst++;
        i++;
    }
    printf("3");
    i = 0;
    while(*snd) {
        strs[1][i] = *snd++;
        i++;
    }
    
    printf("Liste: \n");
    
    for(i = 0; i < 2; i++){
        printf("Text %d: %s\n",i,HEAD(lstPtr++));
    }
    
    return 0;

}

解决方法

此声明之后

    res.str = realloc(res.str,sizeof(char) * (res.len +2));

可以更改指针res.str中存储的值。结果,指针ptr递增后存储在值中

    *ptr++ = *cstr++;

可能无效,并且不指向重新分配的内存中的位置。